Dateien mit dem Browser auf Webserver laden
Geschrieben von: Christian Koller Das HTTP Protokoll bietet die technische Voraussetzung zum Transferieren von Dateien mittels Webbrowser auf den Webserver. Dies kann zum Beispiel genutzt werden um Bild- und Textdateien von berechtigten Personen ganz gezielt auf den Webserver zu laden. Mit "ganz gezielt" meine ich, daß man Kontrolle über die Art der Dateien, ihre Größe, und das Verzeichnis in das sie geladen werden, hat. Was geschieht im einzelnen beim Transfer einer Datei? Sehen wir uns dazu zuerst ein HTML Formular an, das das Laden von Dateien erlaubt: <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> Zuerst einmal ist folgendes zu bemerken: Der FORM Tag arbeitet mit ENCTYPE="MULTIPART/FORM-DATA" und der METHOD="POST". Dies ist notwendig um eine Datei übertragen zu können. ENCTYPE steht dabei für die Art des Übertragunsformats vom Browser zum Server. Das Übertragungsformat "multipart/form-data" erlaubt den Transfer ganzer Dateien, egal ob es sich dabei um Bilder, Texte oder andere Daten handelt. METHOD steht für die Art der Übertragung, wobei der Wert "POST" festlegt, daß die Übertragungsdaten im HTTP Protokoll nicht im sogenannten Header sondern im Body übertragen werden. Der Tag <INPUT TYPE="FILE" NAME="DATEI1"> im Formular gibt an, daß eine Datei beim Absenden des Formulars übertragen wird. Der Feldname, der im Formular für diese Datei steht, heißt beim Beispielformular "DATEI1". Alles was der Benutzer dieses HTML Formulars zu tun hat ist die Auswahl der Datei, die er an den Server schicken will, und das Abschicken des Formulars mittels des SUBMIT Buttons, der mit dem Text "Datei laden" beschriftet ist. Doch was macht nun der Webserver mit den ankommenden Daten? Er nimmt sie zuerst einmal entgegen. Das Objekt, das in ASP normalerweise den Zugriff auf gesendete Daten erlaubt, ist das Request Objekt. Die fünf Collections, die man durch das Request Objekt ansprechen kann, sind wie folgt:
Auf Daten aus HTML Formularen, die mittels METHOD="POST" gesendet werden, kann normalerweise über die Form Collection zugegriffen werden. Doch leider stellt diese Collection nur Daten zur Verfügung, die mittels ENCTYPE="application/x-www-form-urlencoded" (Standardwert für HTML Formulare) übertragen werden. Diese Übertragungsart läßt aber keine Übertragung von Dateien zu. Mit dem IIS und PWS mitgeliefert wird der sogenannte Posting-Acceptor, der aber nur sehr eingeschränkte Kontrolle über empfangene Dateien ermöglicht und zudem nicht direkt in ein ASP Script eingebunden werden kann. Um nun Dateien komfortabel auf den Webserver zu laden benötigt man eine serverseitige Komponente, die das Empfangen und Abspeichern von gesendeten Dateien ermöglicht und Kontrolle über die Größe der Datei, den Speicherpfad und einige andere Dinge ermöglicht. Ich stelle ihnen hier, stellvertretend für andere Komponenten, die SA-FileUp Komponente von Soft-Artisans (http://www.softartisans.com/) vor. Sobald diese Komponente auf dem Webserver installiert ist, kann sie mittels ASP angesprochen werden. Wie könnte nun das Script "DateiLaden.asp" aussehen, das eine Datei vom vorhergehenden Formular empfängt und auf der Festplatte des Servers speichert? Eine einfache Version ist die folgende: <% ' Softartisan.Fileup Komponente initialisieren Set upl = Server.CreateObject("SoftArtisans.FileUp") ' Den Pfad und Namen der Datei abfragen strUserFileName = upl.Form("DATEI1").UserFilename ' Den Namen extrahieren strNewFileName = Mid(strUserFileName,InstrRev(strUserFileName,"\")+1) ' virtuellen Pfad und Namen zum Speichern der Datei festlegen strSaveFileName = "/" & strNewFileName ' Datei speichern upl.Form("DATEI1").SaveAs Server.MapPath(strSaveFileName) %>Dieses Script speichert bereits eine gesendete Datei am Webserver, ist aber noch nicht besonders ausgefeilt. So wird zum Beispiel für den Fall, daß der Benutzer gar keine Datei gewählt und gesendet hat, einfach eine Fehlermeldung ausgegeben, die nicht sofort auf die Ursache schließen läßt. Im einzelnen wird im Script die FileUpload Komponente initialisiert, Pfad und Name der gesendeten Datei mit Hilfe der Objekt Eigenschaft "UserFileName" ausgelesen, der neue Dateiname festgelegt, und die Datei im Webroot unter dem neuen Dateinamen gespeichert. Dies geschieht ohne Rücksicht auf Verluste, sodaß eine bereits bestehende Datei gleichen Namens einfach überschrieben wird. Welche Möglichkeiten sich für Hacker bei Benutzung dieses Scripts auftun ist schier unüberschaubar. So werden zum Beispiel ASP Scripts anstandslos auf den Webserver geladen und sind somit lauffähig. Eine schon sehr komfortable Version des Scripts "DateiLaden.asp" wie folgt aus: <% ' ScriptTimeout und Session.Timeout setzen, sodass ein Upload ' nicht durch eine Timeout des Scripts unterbrochen wird. Server.ScriptTimeout = 600 ' Sekunden Session.TimeOut = 20 ' Minuten Set upl = Server.CreateObject("SoftArtisans.FileUp") ' Pfad zum ablegen temporaerer Dateien angeben upl.Path = "C:\Temp\" ' Dateigroesse begrenzen auf 50 KB upl.MaxBytes = 50000 ' Bytes ' Erlaubte Dateiendungen festlegen arrExt = Array("txt","htm","html") ' Pruefen ob Datei empfangen If Not(upl.Form("DATEI1").IsEmpty=1) Then strUserFileName = upl.Form("DATEI1").UserFilename Response.Write "Datei " & strUserFileName & " empfangen.<BR>" & vbCrLf strNewFileName = Mid(strUserFileName,InstrRev(strUserFileName,"\")+1) strSaveFileName = "/" & strNewFileName intP = InstrRev(strSaveFileName,".") If intP <> 0 Then strExt = Mid(strSaveFileName,intP) blnErlaubteEndung = False For intI = 0 to UBound(arrExt) If strExt = arrExt(intI) Then blnErlaubteEndung = True End If Next If blnErlaubteEndung Then upl.Form("DATEI1").SaveAs Server.MapPath(strSaveFileName) strLink = "http://" & Request.ServerVariables("Server_Name") & _ strSaveFileName Response.Write "Datei ist am Webserver unter " & _ Server.MapPath(strSaveFileName) Response.Write " gespeichert worden.<BR>" & vbCrLf Response.Write "Sie können die upgeloadetet Datei ab " & _ " sofort unter der Adresse " Response.Write "<A HREF=""" & strLink & """>" & strLink & "</A>" Response.Write " abrufen.<BR>" & vbCrLf Else Response.Write "Datei abgelehnt da unerlaubte Dateiendung..." End If Else Response.Write "Datei abgelehnt da keine Dateiendung..." End If Else ' Keine Datei empfangen Response.Write "Es wurde keine Datei empfangen..." End If %> Diese Version prüft nicht nur, ob eine Datei empfangen wurde, sondern setzt auch Timeout Zeiten für längere Downloads bei großen Dateien, begrenzt die Dateigröße auf 50 KB und überprüft, ob eine Datei mit erlaubter Dateiendung geladen wird. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Beliebige Anzahl von Dateien uploaden Links zu anderen SitesWenn 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 |