Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Dateien mit dem Browser auf Webserver laden

Geschrieben von: Christian Koller
Kategorie: Komponenten

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:

  • QueryString
  • Form
  • Cookies
  • ClientCertificate
  • ServerVariables

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&ouml;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 Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Beliebige Anzahl von Dateien uploaden
Dateiupload mit ASP.NET
Uploaden einer beliebigen Datei in eine Datenbank
Web-basiertes Dateimanagement mit dem ASP FileMan

Links zu anderen Sites

Software Artisans

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.