Uploaden einer beliebigen Datei in eine Datenbank
Geschrieben von: Christian Koller 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:
Dateiupload mit ActiveFileZum 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. ASP Skript zum Speichern einer Datei in der DatenbankIch 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.
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. SchlußbemerkungSpeichern 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
ADO und ASP - Datenbanken einmal näher betrachtet Links zu anderen Sites
ActiveFile Komponente Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |