Mark Lutz: Probleme mit PHP download

Hallo,
wenn ich mittels PHP einen download realisieren möchte klappt das zwar mit dem unten beigefügt script, aber es gibt zwei Probleme:

  1. Mir scheint daß, das Script auch dann weiter ausgeführt wird - sprich der download geht weiter - wenn der User den download abbricht. Denn ein neuer Download scheint erst nach einiger Zeit wieder zu funktionieren.

Gibt es eine Möglichkeit so ein Abbrechen abzufangen und das script dann ebenfalls vorzeitig zu beenden?

  1. Beim IE6 (nicht bei Mozilla) tritt bei mir das Problem auf, daß sofern ein Download abgebrochen wurde ein erneutes Downloaden nicht mehr möglicht ist. In der Statuszeile steht ewig "wird geöffnet" aber  das ganze Script reagiert überhaupt nicht mehr.

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

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

    1. #-- 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

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