Geschrieben von: Christian Koller
Kategorie: Komponenten
This printed page brought to you by AlphaSierraPapa
Auf Anregung einer Frage in der AspGerman Liste möchte ich in diesem Artikel demonstrieren, wie man eine beliebige Datei (zum Beispiel ein Bild) vom Client (Browser) auf den Server uploaded und in einer Datenbank speichert.
Wie der Dateiupload vom Client zum Server mittels ASP prinzipiell funktioniert, habe ich bereits im Artikel Dateien mit dem Browser auf Webserver laden dargelegt. Auf die Einzelheiten, die man beachten muß, werde ich natürlich auch in diesem Artikel eingehen.
Dateiupload unter ASP bewerkstelligt man am einfachsten mit einer ActiveX Komponente. Die meisten Upload-Komponenten am Markt erlauben das Uploaden mehrerer Dateien gleichzeitig und auch das Auslesen von weiteren mit dem HTML Formular abgesendeten Werten.
Zur Demonstration der Uploadfunktion mit anschließendem Speichern in einer Datenbank habe ich die ActiveFile Komponente (Version 2.2.7) der Firma Infomentum, Inc. herangezogen, da diese unter anderem das direkte Schreiben einer upgeloadeten Datei in ein ADO Field und damit in eine Datenbank ermöglicht.
Nebenbei bemerkt beherrscht die ActiveFile Komponente nicht nur Dateiup- und Datei-Download, sondern auch das Erstellen und Auslesen von Archiven (ZIP, StuffIT, TAR, GNU zip, MacBinary format), das Impersonalisieren von NT Permissions in ASP Skripts, die Installation von Komponenten (DLL) am Webserver, übergeben von Webserverdateien an den Browser und noch einiges anderes.
Ausserdem kann ActiveFile von Mac Computern upgeloadete Dateien automatisch in PC Format umwandeln indem es die sogenannte "resource fork" des MacBinary Formats entsorgt.
Die Installation der ActiveFile Komponente verläuft meiner Erfahrung nach einfach und reibungslos. Wie bei der Installation vieler anderer Komponente wird dabei kurzzeitig der IIS und damit alle Websites des Server außer Betrieb gesetzt.
Hinweis: Auch in reinem ASP (VBScript) läßt sich eine upgeloadete Datei entgegennehmen und auf der Festplatte oder in einer Datenbank speichern. Die folgenden Scripts zeigen, wie man nur mit VBScript unter ASP einen Dateiupload durchführen kann:
Zum Uploaden von Dateien benötigt man ein spezielles HTML Formular: Im <FORM> Tag muß der Parameter METHOD den Wert "POST" und der Parameter ENCTYPE den Wert "MULTIPART/FORM-DATA" haben.
Das folgende HTML Formular erlaubt den Upload einer Datei zum Server:
<FORM ACTION="DateiLaden.asp" ENCTYPE="MULTIPART/FORM-DATA" METHOD="POST"> Geben Sie den Dateinamen ein: <INPUT TYPE="FILE" NAME="DATEI1"> <BR><BR> <INPUT TYPE="SUBMIT" NAME="Datei laden"> </FORM>
Das Formular finden Sie auch in der Datei form.htm, die im Download zu diesem Artikel enthalten ist.
Schickt man dieses Formular ab, so sendet der Browser die Datei für den Upload an das ASP Skript, das im ACTION Parameter des <FORM> Tags angegeben ist (DateiLaden.asp). So kann das ASP Skript die Datei vom Browser entgegennehmen und am Webserver oder in einer Datenbank speichern.
Wie schon erwähnt benötigt das ASP Skript dazu zwar nicht unbedingt eine Komponente wie ActiveFile, aber es vereinfacht die Sache ungemein.
Die ASP Seite instanziert die Upload-Komponente (z.B. ActiveFile), die dann den HTTP Response vom Browser entgegen nimmt. Dies alles läuft konform zur RFC 1867, "Form-based File Upload in HTML" des W3C ab. Die Upload-Komponente übernimmt dann die volle Verwaltung der upgeloadeten Datei.
Am einfachsten läßt sich die komplexe Funktionalität und das Uploaden eines Bildes anhand eines Beispielskripts erklären.
Ich habe ein ASP Skript namens upload.asp geschrieben, welches eine beliebige Datei entgegen nimmt, den Namen der Datei, die Art der Datei ("ContentType") sowie die Datei selbst in eine Access 2000 Datenbank schreibt. Die Access Datenbank namens UploadDB.mdb finden Sie im Download zum Artikel. Die Datenbank enthält nur die Tabelle tUpload, in der alle Daten der Datei gespeichert werden.
Bild 1: Struktur der Tabelle tUpload
Das Feld ID ist vom Typ AutoNumber, sodaß für jeden neuen Eintrag eine eigene ID generiert wird. Die Felder DateiName und DateiContentType speichern den Namen der upgeloadeten Datei sowie den Dateityp (bzw. ContentType). Im Feld Datei vom Typ OLE Object wird schließlich die Datei selbst gespeichert.
Der Zugriff auf die Access Datenbank erfolgt über ADO und den OLE DB Provider for JET.
Natürlich kann man die Dateien in jeder anderen Datenbank (SQL Server, Oracle, DB2 ..) speichern. In einer SQL Server Datenbank würde man dann für das ID Feld ein Identity Feld nehmen (siehe Zugriff auf autom. generierte ID beim Einfügen eines Datensatzes). Der entsprechende Datentyp zu AutoNumber in Access ist in einer SQL Server Datenbank der Datentyp image.
Nun aber zum eigentlichen ASP Skript namens upload.asp. Das Skript managt den Dateiupload durch Einsatz des ActiveFile.Post Objektes, das alle Dateien des Uploads empfängt und in ein temporäres Verzeichnis schreibt. Das ActiveFile.Post Objekt ist Teil der ActiveFile Komponente.
Danach wird eine Datenbankverbindung zur Access Datenbank UploadDB.mdb hergestellt, um die Datei darin zu speichern. Zuerst wird ein leeres Recordset (CursorLocation = adUseServer, CursorType = adOpenKeyset und LockType = adLockOptimistic) geöffnet, um mit Hilfe dieses Recordsets unter Einsatz der Recordset.AddNew und der Recordset.Update Methoden die Daten der Datei (Name und Contenttype) sowie den Inhalt der Datei in die Datenbank zu schreiben.
Das Schreiben des vollen Inhaltes der upgeloadeten Datei geschieht mittels Import Methode des ActiveFile.File Objektes:
File.Import rs("Feldname")
Das volle Listing des ASP Skripts - mit vielen wertvollen Kommentaren - finden Sie im Download und hier.
Sobald eine Datei in der Datenbank gespeichert ist gibt das Skript die ID für den Datensatz aus der Tabelle tUpload zurück. Ausserdem präsentiert das Skript einen Link zum ASP Skript namens download.asp, das ein Auslesen der Datei aus der Datenbank und Senden zum Browser bewerkstelligt.
Die Datei download.asp liest den Dateinamen sowie den Datetyp (Contenttyp) der gespeicherten Datei aus und sendet die Datei unter Angabe des Contenttype und des ursprünglichen Dateinamens zum Browser.
Damit der Browser die Datei richtig (und nicht als ASP-Datei) zur Anzeige bzw. zum Download akzeptiert, muß man im ASP Skript den Browser dementsprechend instruieren. Dies geschieht mittels Response.ContentType und Response.AddHeader "Content-Disposition", "inline; filename=Dateiname". Dazu setzt man Response.ContentType auf den in der Datenbank gespeicherten Wert des Feldes DateiContenttype. Der Dateiname wird durch den HTTP Header namens "Content-Disposition" mit dem Wert "inline; filename=Dateiname.ext" zum Browser gesendet.
Die Datei selbst wird aus dem ADO Field (mittels Field.GetChunk) ausgelesen und durch den ASP Befehl Response.BinaryWrite zum Browser geschickt:
... ' HTTP Header setzen und Datei zum Browser senden Response.ContentType = strContentType Response.AddHeader "Content-Disposition", _ "inline; filename=" & strFileName Response.BinaryWrite rs("Datei").GetChunk(rs("Datei").ActualSize) ...
Das volle Skript der Datei download.asp finden Sie im Download zu diesem Artikel und hier.
Speichern von beliebigen Dateien - wie zum Beispiel Bildern, Word-Dokumenten, ASP-Dateien, ZIP-Archiven - in Datenbanken läßt sich mit Hilfe von Komponenten in ASP einfach bewerkstelligen.
Zum Auslesen einer Datei aus der Datenank und Senden zum Browser genügt ganz gewöhnliches ASP, wenn man ein paar Kniffe (zusätzliche HTTP Header und Einsatz von Response.BinaryWrite) benutzt.
Für die jenigen, die trotzdem mehr zum Dateiupload OHNE ASP-Komponente wissen möchte empfehle ich die Linkliste am Ende dieses Artikels.
Für Fragen und Anregungen bin ich als Autor immer Dankbar, bitte benutzen Sie dazu den Link "Autor kontaktieren" am Ende des Artikels.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001030.zip
ADO und ASP - Datenbanken einmal näher betrachtet
http:/www.aspheute.com/artikel/19990825.htm
Auswertung von HTML Formularen mit ASP
http:/www.aspheute.com/artikel/20000406.htm
Beliebige Anzahl von Dateien uploaden
http:/www.aspheute.com/artikel/20010510.htm
Dateien mit dem Browser auf Webserver laden
http:/www.aspheute.com/artikel/19990812.htm
Dateiupload mit ASP.NET
http:/www.aspheute.com/artikel/20000802.htm
ActiveFile Komponente
http://www.infomentum.com/activefile/
ASP File Upload using VBScript
http://www.aspzone.com/articles/john/aspUpload/
AspGerman Liste
http://www.aspgerman.com/aspgerman/listen/
AspGerman Liste - Archiv
http://www.aspgerman.com/aspgerman/listen/archiv/
Create and work with binary data in ASP/VBS
http://www.pstruh.cz/tips/detpg_BinASP.htm
Dateiupload per ASP ohne Komponente
http://www.teamone.de/selfaktuell/artikel/aspupload.htm
File Uploading with ASP and VBScript
http://www.asptoday.com/articles/20000316.htm
Infomentum, Inc.
http://www.Infomentum.com/
Pure ASP Upload
http://www.pstruh.cz/help/ScptUtl/library.htm
ScriptUtilities - Komponenten zum Manipulieren von Binärdaten
http://www.pstruh.cz/help/ScptUtl/library.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.