Mit ASP ein Download erzwingen?

Er meckert aber rum, weil bei einem Aufruf von Unterroutinen keine Klammern stehen dürfen. Wenn ich die Klammern wegmache, gehts. Aber nur so "gut" wie vorher auch. Die Fehler sind immer noch nicht weg.

Was ist das denn?
 
Hallo,

um einen Download in ASP zu erzwingen braucht man nicht unbedingt eine 'fremde' Komponente.
Es geht auch mit ASP eigenen Mitteln.

Hier ein Snippet von einer alten Seite von mir

Code:
Response.ContentType = "application/octet-stream"



' ---  benötigte Konstanten des Streamobjekts
Const adTypeBinary = 1





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

Response.CharSet = "UTF-8" 



	Set objStream = Server.CreateObject("ADODB.Stream")



		Streamer.Type = adTypeBinary

		Streamer.Open

		Streamer.LoadFromFile(strMyPath)

		Response.BinaryWrite Streamer.Read(Streamer.Size)

		Streamer.Close

	    

	Set Streamer = Nothing



Response.Flush

Ich hatte immer nur die selbe Art von Dateien zum downloadn, RAR-Archive, deswegen ist der ContentType auf application/octetstream.
Solltest du andere Typen benötigen solltest du dir eine Liste mit den korrekten ContentType zur Endung beschaffen, in einem der PHP-Tutorials ist eine solche.

Am Besten einfach die Erkennung über die Endung der Datei.


Mfg,
Alex
 
Danke für den Vorschlag,

kannst D umir näher erläutern, wie du dir das vorstellt mit den mehreren Content.Types. Kann mir momentan nicht vorstellen, wie ich das realisieren kann!

Danke
 
Du könntest dir ein Dicitonary-Objekt anlegen, und in diesem die verschiedenen Dateiendungen mit dem dazugehörigen ContentType speichern.

Wenn nun ein User eine Datei herunterladen will, schaust du was für eine Endund die Datei hat, holst aus dem DictionaryObjekt den ContentType.
Den ermittelten WErt weist du 'Response.ContentType' zu.

Mfg,
Alex
 
Bei mir klappt das noch nicht, wenn ich erstmal ein Typ downloaden will.

Schau mal:

%
Response.ContentType = "text/html"

strselfolder=Request.QueryString ("folder")
file_name=Request.QueryString ("file")

' --- benötigte Konstanten des Streamobjekts
Const adTypeBinary = 1


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

Response.CharSet = "UTF-8"

Set objStream = Server.CreateObject("ADODB.Stream")


Streamer.Type = adTypeBinary

Streamer.Open

Streamer.LoadFromFile("../.."& strSelFolder & "/")

Response.BinaryWrite Streamer.Read(Streamer.Size)

Streamer.Close


Set Streamer = Nothing

Response.Flush
%>

Die Seite kann nicht angezeigt werden!
 
Wenn du eine Datei anbieten möchtest die nicht aus Binärdaten besteht (Textdateien,..) musst du den Typ umstellen.

Code:
...
Const adTypeText = 2
...
Streamer.Type = adTypeText
...

// Alex
 
Alexander Schuc hat gesagt.:
Wenn du eine Datei anbieten möchtest die nicht aus Binärdaten besteht (Textdateien,..) musst du den Typ umstellen.
Also bei mir funktionierts mit u.g. Code auch mit adTypeBinary. Ich beschäftige mich allerdings noch nicht allzulang mit der Materie um da mehr beitragen zu können. Brauchte es mal, um eine Powerpoint-Datei zum Download zu bringen.

Ein Liste der registrierten content.types findest Du auch, wenn Du in der Systemsteuerung, Verwaltung die Internet-Informationsdienste aufrufst. Rechte Maustaste, Standardwebsite --> MIME-Zuordnungen --> Bearbeiten, da ist alles aufgelistet, was vom System registriert ist, bei mir lokal zumindest.

Das stream-Objekt ist eines der standardmäßig vorhandenen ADO-Objekte, die mit MDAC 2.5 oder höher mitgeliefert werden.

Bei mir funktioniert folgender Code. Filename und strFilePath sind dann auch dyn. einzusetzen.

<%
Response.ContentType = "text/html"
Response.AddHeader _
"content-disposition","attachment;filename=test.txt"

strFilePath = "C:\Inetpub\wwwroot\pfad\unterpfad\test.txt"

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 'adTypeBinary
objStream.LoadFromFile strFilePath

Response.BinaryWrite objStream.Read

objStream.Close
Set objStream = Nothing
%>
 
Kann das sein?

Habe folgende Seite und habe sie erst mit .txt-Dateien ausprobiert und es ging:

<%
Response.Buffer = TRUE
Response.Clear
Response.Expires = 0

strselfolder=Request.QueryString ("folder")
file_name=Request.QueryString ("file")

Response.ContentType = "html/text"

strFileName = file_name
strMyPath = Server.MapPath("../..") & strselfolder & 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.Clear()
Response.BinaryWrite(objFile.Read(FileSize))
Set objFile = Nothing

Set objFileSys = Nothing

Response.Flush
%>

Dann habe mit demselben Script auch andere Dateien verscuht downzuloaden (.exe, .asp,.gif) und es hat auch einwandfrei funktioniert.
Sogar wenn ich die Angabe des Content-Type weglasse, funktioniert das Ganze!

Warum? Das verwirrt mich!
 
Zurück