Dateiupload mit ASP ohne Komponente

Hallo zusammen,

Ich habe vor 3 Wochen angefangen mich für den Upload mit ASP zu interessieren. Dabei habe ich einige Seiten im Netz gefunden aber nichts was mir zusagte.
Entweder wurde der Code in eine schöne Klasse verpackt oder ohne Kommentare in viele Funktionen verteilt.
Dadurch kam ich einfach nicht dahinter wie das denn funktioniert.
Nach ca. 14 Tagen probieren hab ich es dann geschafft das ganze nur mit ASP zu realisieren.

Ích muss sagen es läuft wunderbar und schleppt mir bis 20MB große Daten „hoch“. Mit einem größeren TimeOut bestimmt noch mehr :smile:

Wieso bei fast alles Antworten auf Komponenten verwiesen wird ist mir schleierhaft.
Deshalt möchte ich heute mal meine Version vorstellen.

Erstmal ein paar Infos zum Script.

Die Datei muss mit:
ENCTYPE=„multipart/form-data“ im Formular hochgeladen werden.

Empfangen werden alle Daten in einem Stream der im
Request-Object gespeichert wird.
Über Request.TotalBytes erhält man die Größe des Streams.

Der Sinn ist nun diesen Stream zu zerlegen. Dazu muss man wissen wie der aufgebaut ist. Hier mal ein Beispiel:

Das bekommt man als ASCII Code geschickt.

-----------------------------7da2019200de
Content-Disposition: form-data; name=„Bild1“; filename=„E:\100K7530\bild_16.jpg“ Content-Type: image/pjpeg

Ab hier beginnt die Datei :smile: (Binärdaten)
ÿØÿà

Wie man sehen kann beginnt der Stream mit vielen -----.
Danach kommen ein paar Infos über den Type und den Dateiname.
Anschließend folgen 2 Zeilenumbrüche, erst dann folgt die Datei.

Das Ende sieht ähnlich aus:
hier ist noch die Binärdatei.
™§HÿÙ
hier wieder 1 Zeilenumbruch und die --------
-----------------------------7da2019200de
Content-Disposition: form-data; name=„knopf“

Upload
-----------------------------7da2019200de–

Somit haben wir schon alles was wir brauchen und müssen es nur noch extrahieren.

Damit wir auch mit ASCII arbeiten können muss der gesamte Stream von Binär auf ASCII umgewandelt werden.
Das geht einmal mit der Funktion:

For i = 1 To LenB(daten)
ascdatei = ascdatei & Chr(AscB(MidB(daten, i, 1)))
Next

(‚daten‘ ist hier der Binärstream)
Da das zu lange dauert speichern wir das ganze als Binär ab und lesen als ASCII wieder ein. Das geht schneller :smile:

Den temporären Dateinamen ermitteln wir mit der Split Funktion aus der IP des Users z.B.
IP 192.168.2.22 = 192168222.dat

set objfs = Server.CreateObject(„Scripting.FileSystemObject“)
set objdatei = objfs.OpenTextFile(pfad & tmpdateiname,2,true,true)
objdatei.Write(Request.BinaryRead(Request.TotalBytes))

Achtung: nach der 2 (schreiben), 2x true einsetzen!!!
Nun alles wieder als ASCII lesen:

set objfs = Server.CreateObject(„Scripting.FileSystemObject“)
set objdatei = objfs.OpenTextFile(pfad & tmpdateiname, 1, true, false)
ascdatei = objdatei.read(Request.TotalBytes)

Somit haben wir in der Variablen ascdatei den ASCII Stream und können damit arbeiten.

Wie oben beschrieben ist der Anfang der Binärdatei nach zwei Zeilenumbrüchen = Chr(13) & Chr(10) & Chr(13) & Chr(10).
Hier müssen wir noch 4 addieren für die 4 Zeichen.
Das Ende ist nach einem Zeilenumbruch und dem „–“ Zeichen = Chr(13) & Chr(10) & Chr(45) & Chr(45)

Nun können wir schon die Datei mit der MID Funktion auslesen und schreiben.
Hier nochmal alles zusammen:

beginn = inStr(1,ascdatei,Chr(13) & Chr(10) & Chr(13) & Chr(10))
beginn = CLng(beginn) + 4
ende = inStr(beginn,ascdatei,Chr(13) & Chr(10) & Chr(45) & Chr(45))
anzahldaten = Clng(ende) - Clng(beginn)

set objfs = Server.CreateObject(„Scripting.FileSystemObject“)
set objdatei = objfs.OpenTextFile(„E:\WWW Root\Nicky\UPLOAD“ & dateiname, 2, true, false)
objdatei.write(mid(ascdatei,beginn,anzahldaten))

Den Dateiname habe ich mit 2 Splitmethoden ausgelesen und in einer Variablen (dateiname) gespeichert.

Und das wars auch schon…
Wer gern das ganze Script haben möchte kann sich gern melden.
Das einfache Script kommt mit 36 Zeilen ASP aus, ich habe noch ein paar Prüfungen aufgenommen damit man anschließend informiert wird ob alles erfolgreich war. Falls ein Bild hochgeladen wird, kann man es auch gleich im Browser sehen.

Damit kann man alle Arten von Daten hochladen
(Standard bis 20 MB im LAN) oder einfach das
Server.ScriptTimeout auf 600 (10 min)
hochsetzen, dann geht auch mehr :smile:

Und nun viel Spass

Hallo Supernicky,

Gut gemacht! =)
Ich brauch ihn jetzt zwar nicht mehr, aber ich kann mich noch dran erinnern wie schwer es war als ich zum ersten mal einen Upload machen wollte :wink:

Mfg,
Jannik