Kategorie: Dateizugriff
Frage: Wie kann ich eine Datei (doc, pdf, gif, mdb, ...) zum Download anbieten ("Speichern unter ...")?
Sicherlich haben Sie auch schon vor dem Problem gestanden, dass Sie Ihren Usern gerne
ein Word- oder PDF-Dokument zum Download anbieten möchten, der Browser aber diese
Datei direkt öffnet und dem User den "Speichern unter ..."-Dialog gar nicht erst anbietet.

Dies beruht auf der Tatsache, dass moderne Browser in der Lage sind, die zu den Dateitypen
zugehörigen Programme (z.B: Microsoft Word, Adobe Arcobat Reader, ...) zu öffnen und die
entsprechende Datei direkt an das Programm zu übergeben.

Um immer den "Speichern unter ..."-Dialog zu erzwingen, müssen Sie die Datei mit ASP auslesen
und die Daten selbst zum Browser senden. Dies lässt sich aber eigentlich ganz einfach machen:

Im nachfolgenden Beispiel möchten wir dem Browser ein Word-Dokument senden, dass im Ordner
"<aktuellerpfad>/dokumente/" liegt und "test.doc" benannt wurde.

[sendfile.asp]
<%
Response.Buffer = TRUE
Response.Clear
Response.Expires = 0
Response.ContentType = "application/msword"

strFileName = "test.doc"
strMyPath   = Server.MapPath("./dokumente/") & "\" & strFileName

Response.AddHeader "Content-Disposition","attachment;filename=" & strFileName

Set objFileSys = Server.CreateObject("Scripting.Filesystemobject")

    ' --- Ermitteln der Dateigroesse
    Set objFile = objFileSys.GetFile(strMyPath)
        FileSize = objFile.Size
    Set objFile = Nothing

    ' --- Öffnen der Datei
    Set objFile = objFileSys.OpenTextFile(strMyPath, 1, false, -1)

        ' --- Auslesen des Dateinhalts und Ausgabe
        ' --- per Response.BinaryWrite
        Response.BinaryWrite(objFile.Read(FileSize))

        ' --- Sollte es Probleme beim Download geben (ab und zu
        ' --- kommt es vor, dass Zip-Archive nicht richtig geöffnet
        ' --- werden können, benutzen Sie die nachfolgende Anweisung
        ' --- Damit wird ein abschliessendes Zeichen mitgesendet, dass
        ' --- dieses Problem behebt.
        ' --- Response.BinaryWrite(objFile.Read(FileSize) & ChrB(0))

    Set objFile = Nothing

Set objFileSys = Nothing

Response.Flush
%>



Mit verschiedenen Browsern gibt es aber auch hier evtl. Probleme in der Art, dass der
Dateiinhalt trotzdem im Browser angezeigt wird, da die Implementierung des Headers
Content-Disposition fehlerhaft ist. Siehe folgende Microsoft Knowledge-Base Artikel:
http://support.microsoft.com/support/kb/articles/Q279/6/67.ASP ff. (IE 5.x) und
http://support.microsoft.com/support/kb/articles/Q182/3/15.ASP (IE 4.x).
Netscape hat mit verschiedenen Versionen aber ebenfalls Probleme mit diesem Header,
so dass man eigentlich keine allgemeingültige Lösung anbieten kann. Verschiedene
Workarounds werden aber in den nächsten Tagen hier angeboten werden.


Copyright 2000 - 2021 by Stefan Falz Webconsulting