Probleme mit PHP download
Mark Lutz
- php
Hallo,
wenn ich mittels PHP einen download realisieren möchte klappt das zwar mit dem unten beigefügt script, aber es gibt zwei Probleme:
Gibt es eine Möglichkeit so ein Abbrechen abzufangen und das script dann ebenfalls vorzeitig zu beenden?
hier ist ein Auszug aus meiner "download.php"
if (strstr($HTTP_USER_AGENT,"MSIE 5.5")) { // had to make it MSIE 5.5 because if 6 has no "attachment;" in it it defaults to "inline"
$attachment = "";
} else {
$attachment = "attachment;";
}
header("Cache-control: max-age=31536000");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header("Content-Length: " . $_GET[size]);
header("Content-type: application/octet-stream");
header("Content-disposition: $attachment filename=".$_GET[file]);
header("Content-Transfer-Encoding: binary");
readfile("upload/".$_GET[file]);
Was spricht denn dagegen, daß ich den download über header(location: "http://www.meinedomain/meinfile.zip") regele? Dann treten die Probleme nicht auf. Allerdings kann ich so zumindest mal keine PDFs, Diverse Graphikformate, etc. zum Download anbieten weil die ja alle direkt im Browser geöffnet werden würden. Oder geht das doch?
Grüße,
Mark
Hey Mark,
Was spricht denn dagegen, daß ich den download über header(location: "http://www.meinedomain/meinfile.zip") regele? Dann treten die Probleme nicht auf. Allerdings kann ich so zumindest mal keine PDFs, Diverse Graphikformate, etc. zum Download anbieten weil die ja alle direkt im Browser geöffnet werden würden. Oder geht das doch?
Spricht eigentlich nichts dagegen, allerdings ist es dann natürlich
schwierig die gewünschten HTTP-Header hinzuzufügen. Beim Apache gibt es da
eigentlich nur zwei Möglichkeiten, die man an dieser Stelle empfehlen könnte.
Du solltest zunächst alle deine Download-Dateien in einen eigenen Ordner
packen, und dort in der .htaccess alle Dateitypen auf
"application/octet-stream" umbiegen, so daß die Dateien nicht mehr direkt im
Browser angezeigt werden, und stattdessen das Download-Fenster aufspringt.
#-- Dateitypen 'umbiegen'
AddType application/octet-stream .pdf .ps
AddType application/octet-stream .xpm .png .jpeg
#-- geht evtl. auch bei Apache(?)
DefaultType application/octet-stream
Bei vielen Webservern gibt es außerdem die Mglk. HTTP-Header via .htaccess
hinzuzufügen, beim Apache geht das leider nicht so einfach; hier könntest du
bestenfalls versuchen deinen Download-Dateien die Dateiendung ".asis" zu
geben, und die entsprechenden Header dann an den Anfang einzufügen (aber
bitte nur mit einem ordentlichen Editor, und nach Mglk. nicht unter
Windoof). Für eine PDF-Datei würde das dann so aussehen:
-------------------------------------------------- schnipp ---------
Content-Type: application/x-pdf \r\n
Content-Disposition: attachment; filename="example.pdf" \r\n
C-T-E: binary \r\n
\r\n
%PDF-1.4\r%âãÏÓ\r
110 0 obj\r<< \r/L ...
-------------------------------------------------- schnapp ---------
Ist vielleicht eine elegante Lösung, aber wie üblich bei Billig-Providern
nicht verfügbar. Und davon abgesehen, mußt du ja dann alle Dateien
entsprechend vorbereiten.
MsF,
milky
#-- Dateitypen 'umbiegen'
AddType application/octet-stream .pdf .ps
AddType application/octet-stream .xpm .png .jpeg#-- geht evtl. auch bei Apache(?)
DefaultType application/octet-stream
Hey,
vielen Dank für die Antwort. Hab meine htacces entsprechend modifiziert. Aber es scheint meinen Apachen nicht wirklich beeindruckt zu haben. Es werden fleißig weiter die Bilder, TXT, PDFs, etc. angezeigt statt heruntergeladen.
Gruß,Mark
Hey,
Es werden fleißig weiter die Bilder, TXT, PDFs, etc. angezeigt statt heruntergeladen.
Dann solltest du nachprüfen ("wget -S"), ob der entsprechende Header auch
wirklich bei dir ankommt. Es kann natürlich auch sein, daß einige Browser
(IE?) diesen MIME-Typ völlig ignorieren und ihn stattdessen jedesmal aus dem
Datei-Inhalt bestimmen ("mime-magic").
Falls der MIME-Typ einfach nicht richtig ankommt, kannst du ihn
natürlich auch in die Verweise eintragen:
<a href="..." type="application/octet-stream">...</a>
oder irgendsowas
Wenn dein Browser die Dateien dann immer noch anzeigt, denk dir einfach
einen total bescheuerten MIME-Typ aus (type="x-application/x-download-me"),
dann kommt zumindest wieder die Abfrage, ob die Datei gespeichert oder mit
einem anderen Prog. geöffnet werden soll.
Grüße,
milky