Das hochladen einer Datei in classic asp
Habe ich immer verwendet das folgende Skript zum hochladen von Dateien in classic asp, aber es aufgehört zu arbeiten mir dieser Fehler
vbscript runtime error 800a01a8
Objekt erforderlich 'Punkt(...)'
Untersuchte ich ein wenig und ich denke, dass ist das problem beim hochladen der Datei.asp mit der Funktion BuildUploadRequest, aber ich kann wirklich nicht verstehen, warum
form
<form method="POST" action="landing-page.asp" ENCTYPE="multipart/form-data">
<input type="file" name="file">
<input type="hidden" name="key" value="0">
<input type="submit" name="send" value="1">
</form>
Seite, wo das Formular landet
byteCount = Request.TotalBytes
RequestBin = Request.BinaryRead(byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
BuildUploadRequest(RequestBin) '//function defined in upload.asp
if UploadRequest.Item("key").Item("Value")="0" then '//this is the line giving the error
'//code here...
end if
hochladen.asp
Sub BuildUploadRequest(RequestBin)
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
'//Get all data inside the boundaries
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
'//Members variable of objects are put in a dictionary object
Dim UploadControl
Set UploadControl = CreateObject("Scripting.Dictionary")
'//Get an object name
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
'//Test if object is of file type
If PosFile<>0 AND (PosFile<PosBound) Then
'//Get Filename, content-type and content of file
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
'//Add filename to dictionary object
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
'//Add content-type to dictionary object
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
'//Get content of object
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
Else
'//Get content of object
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
End If
'//Add content to dictionary object
UploadControl.Add "Value" , Value
'//Add dictionary object to main dictionary
'//response.write name & "<br>"
UploadRequest.Add name, UploadControl
'//Loop to next object
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
'//String to byte string conversion
Function getByteString(StringStr)
For i = 1 to Len(StringStr)
charx = Mid(StringStr,i,1)
getByteString = getByteString & chrB(AscB(charx))
Next
End Function
'//Byte string to string conversion
Function getString(StringBin)
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin,intCount,1)))
Next
End Function
Dieser code hat immer funktioniert, bei jedem Projekt, aber jetzt funktioniert es nicht überall. Ich kann also nicht einfach Bearbeiten und verwenden Sie eine andere Funktion, die ich brauche, um zu verstehen, warum es nicht mehr funktioniert
- Haben Sie die Kommentare manuell? Grund warum ich Frage ist VBScript Kommentar-syntax verwendet
'
nicht//
dazu führen, dass der script der Fehler zu einem syntax-error. - Ja, habe ich, wenn da nicht die Frage, layout würde schrecklich Aussehen
- Ich habe es angepasst zu verwenden VBScript-Kommentare.
- tatsächlich, VBScript versteht
//
als Kommentar-delimiter - Sie geben nicht einen syntax-Fehler. - Es gerade getestet und bekomme einen Kompilierungsfehler, wie erwartet. Könnte funktionieren, in der Klassischen ASP - (nicht getestet), aber das hat nichts zu tun mit VBScript eher das ASP-Modul ist die vorsorge für JScript unterstützen.
- Erstens, ändern Sie Ihre
CreateObject("Scripting.Dictionary")
zuServer.CreateObject("Scripting.Dictionary")
statt. Klingt vielleicht albern, aber ich habe Fälle gesehen, wo diese Dinge verursacht zu brechen. (Irgendwas mit Objekt-Rahmen) - seine ein windows-update KB3104002 problem
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fix #1 - Deinstallieren "KB3104002 Kumulative Sicherheitsupdate für den IE11"
Update #2 - Kopieren Sie alle byte-arrays in einen string von byte-Werten zu arbeiten und gegen diese, oder geben Sie einen Ersatz für instrb, dass die eigenen iteration über das array.
Fix #3 - Microsoft hat einen hotfix veröffentlicht. Diese gehen an alle, die im Januar 2016. Sie können es früh hier. https://support.microsoft.com/en-us/kb/3125446
Das problem scheint zu sein, dass die InstrB-Funktion in vbScript gibt nun einen Wert von 1 unter den folgenden Bedingungen.
Wenn Sie sind auf der Suche nach einem string, oder, wenn Sie sind auf der Suche nach einem multibyte-Muster, dann InstrB funktioniert.
Auf meine defekte Systeme, die diese Funktion gibt immer eine 1, obwohl kein byte mit dem Wert 13 an position 1. Es gibt 1 für einen beliebigen Wert bei der Suche in einem byte-array. Das klassische ASP-Datei-upload-Komponenten, die ist, warum wir alle in diesem thread, in dieser situation, denn Sie sind Parsen, das byte-array der Suche nach Trennzeichen.
Diese obigen Zeilen funktionieren gut und wie erwartet. Multibyte-sucht und Spiele gegen einen string funktioniert wie erwartet.
Dieses problem traf mich gleichzeitig auf mehrere Server in der letzten Nacht. Ich sah, dass die windows-system-updates lief Letzte Nacht auch. Verengung nach unten, ich fand, dass MS15-124 (KB3104002 Kumulative Sicherheitsupdate für den IE11) enthalten ein update für vbscript.dll. Ich entfernt das update und jetzt gibt der code zu funktionieren.
Legte ich ein Problem auf Ihrer "IE Connect" - system, da Sie in einem IE-update, aber ich bin mir nicht sicher, ob das der richtige Ort.
Habe ich schonmal ein test case. Bei kaputten systems, es wird wieder "5, 1, 5". Auf funktionierende Systeme zurück "5, 5, 5"
In der Hoffnung auf einen fix. Einige dieser alten code läuft auf Systemen, die ich nicht haben Zugang zu.
Ich hatte das gleiche problem in der klassischen ASP, InStrB plötzlich Rückgabe 1, auch wenn ich validiert-debugger, der es nicht sollte, d.h. Charakter in Frage wurde an position 17.
Schrieb ich die folgenden Ersatz-Funktion für die InStrB (nur verwenden, wenn man für 1 char). Ich bin eine beschissene VBS-Programmierer, so fühlen sich frei, um diese sauber auf. Aber es scheint zu funktionieren...
Microsoft hat einen Hotfix veröffentlicht, um dieses Problem zu beheben.
https://support.microsoft.com/en-us/kb/3125446
Versuchen, diese upload-code (credit Lewis Moten) statt: http://planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=8525&lngWId=4
Ich lief in das gleiche problem vor kurzem bei der Migration einer Website auf eine neuere version von Windows Server. Mit Lewis Moten ' s hochladen von code statt das problem behoben.
Falls der link stirbt, ist der code auch gepostet in diese Antwort.
Ich kann nicht Antworten, um den ursprünglichen Kommentar durch low-rep, aber in Fall können Sie nicht entfernen Sie das update über die normale Systemsteuerung Methoden wie könnte ich nicht (Es erscheinen nicht in der Liste deinstalliert) hier ist, wie man mit Powershell und der Befehlszeile:
Vorübergehende Lösung, um Deinstallieren "KB3104002 Kumulative Sicherheitsupdate für den IE11":
Tun, die folgenden zu prüfen, ob ein update installiert ist:
Wenn das update installiert ist, weiter:
Einschränkung: KB3104002 ist gelistet als "Kritisches Sicherheitsupdate" laut Microsoft also ich würde nicht empfehlen, ignorieren Sie dieses update ewig, sondern als eine zeitliche Auflösung, um die Probleme, die dieses update verursacht, das ist, was ich wählte zu tun. Ich denke, dass Microsoft wird die Ausstellung von einem update für dieses update, das sich mit dem Massaker, es ist offensichtlich verursacht mit ASP-code noch im Einsatz.