Patrick Sch.: Download-Script, Problem im IE, Die heruntergeladene Datei kann

Hallo allerseits,

ich habe seit Ewigkeiten ein Download-Script auf diversen Seiten laufen, das auch bisher immer einwandfrei gearbeitet hat. Nun wies mich jemand darauf hin, dass dort ein "Fehler" im IE auftaucht. Man könne die Datei nur noch speichern, aber nicht mehr öffnen und "nur ansehen". Ich habe der Person dann zunächst die Technik erläutert wie das Ansehen abläuft. Dennoch scheint es für Laien ein anderes Gefühl zu sein.

Als ich mir dann den Fehler einmal direkt angeschaut habe, sehe ich im aktuellen IE 8, 32 Bit beim Downloadstart folgende Fehlermeldung unterhalb des Speichern- / abbrechen-Dialogs, in dem im übrigen auch das richtige Datei-Format erkannt wird.

Die Fehlermeldung des IE lautet:

Die heruntergeladene Datei kann nicht von dem standardmäßigen Programm geöffnet werden. Sie ist entweder beschädigt oder der Dateityp ist falsch. Aus Sicherheitsgründen wird empfohlen den Download abzubrechen. [...]

Ich habe nun das Script noch einmal auf anderen Seiten geprüft mit Dateien, die dort schon länger liegen und die eindeutig heile sind, jedoch wird auch hier die Fehlermeldung angezeigt.

Hier die wesentlichen Scriptdaten:

  
header('Content-Description: File Transfer');  
header('Content-Type: application/octet-stream');  
header('Content-Disposition: filename=\''. $saveName .'\'');  
header('Expires: 0');  
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');  
header('Pragma: public');  
header('Content-Length: '. filesize($fileDir));  
  
if (readfile($fileDir)) {  
  //DB-Statistik  
}  
  
ob_clean();  
flush();  

Auch nach längerer Google-Suche habe ich hier noch keinen wirklichen Anhaltspunkt, wo der Fehler sitzen könnte. Ein doppelter Content-Type mit dem Mimetype der Datei führt jedenfalls nicht zu einem Ergebnis.

Bin für jede Idee dankbar.

Gruß Patrick

  1. Hallo,

    vielleicht passt windows ja der die Dateiendung nicht.

    Wie wäre es mit einem Test, in dem du alles rausstreichst, was nicht nötig ist. zb. auch den dateinamen mal fixierst "test.pdf" oder so, statt variablen zu nutzen. Abgesehen davon: mixe doch " mit ' dann sparst du dir die Escaperei.

    Gruß

    jobo

  2. Hallo,

    zu "es wird empfohlen den download abzubrechen" findet sich aber was bei google, oder?

    http://www.aspnetzone.de/forums/thread/194545.aspx

    Gruß

    jobo

  3. Hello,

    header('Content-Type: application/octet-stream');
    header('Content-Disposition: filename=''. $saveName .''');

    Diese beiden sollten zueinander passen.
    Wenn Du Textdateien anbietest, sollte der Contenttype auch dazu passen und die Dateiendung sollte auch zu einer Textdatei gehören.

    "application/octet-stream" bedeutet jedenfalls "unspezifizierte Binärdatei". Da kann sich dann auch schon mal ein Programm dahinter verbergen.

    Es obliegt dem Client, ob er überhaupt eine Assoziation zu einer Anwendung ausführt. Welche soll das sein, wenn Du eine Binärdatei anbietest?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      header('Content-Type: application/octet-stream');
      header('Content-Disposition: filename=''. $saveName .''');
      Wenn Du Textdateien anbietest, sollte der Contenttype auch dazu passen und die Dateiendung sollte auch zu einer Textdatei gehören.

      es sei denn, man möchte bewusst keine Information über den Dateiinhalt geben, weil es nur ein generisches Download-Angebot ist - so verstehe ich Patricks Startposting jedenfalls.

      "application/octet-stream" bedeutet jedenfalls "unspezifizierte Binärdatei". Da kann sich dann auch schon mal ein Programm dahinter verbergen.

      Richtig. Oder ein Video. Oder ein PDF.

      Es obliegt dem Client, ob er überhaupt eine Assoziation zu einer Anwendung ausführt. Welche soll das sein, wenn Du eine Binärdatei anbietest?

      Einfach nur die Frage, wo denn bitte die heruntergeladene Datei zu speichern wäre. Allerdings ist gerade der IE dafür bekannt, dass er den Content-Type nicht so ernst nimmt und stattdessen lieber aus der Namensendung und den ersten paar Bytes der ankommenden Nutzdaten vesucht zu erraten, was hier wohl für eine Datei/Ressource vorliegt. Deswegen interpretiert er beispielsweise auch HTML, selbst wenn es "absichtlich" als text/html ausgeliefert wird, weil man es als Quellcode zeigen möchte.

      Firefox 3.0 macht übrigens ähnlichen Quark. Eine Videodatei (z.B. als AVI- oder WMV-Container), die als application/octet-stream ausgeliefert wird, übergibt er trotzdem bevorzugt an die dafür zuständige Default-Anwendung, z.B. den Windows Media Player.

      Ciao,
       Martin

      --
      Es gibt Tage, da gelingt einem einfach alles.
      Aber das ist kein Grund zur Sorge; das geht vorbei.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hello,

        Hi,

        header('Content-Type: application/octet-stream');
        header('Content-Disposition: filename=''. $saveName .''');
        Wenn Du Textdateien anbietest, sollte der Contenttype auch dazu passen und die Dateiendung sollte auch zu einer Textdatei gehören.

        es sei denn, man möchte bewusst keine Information über den Dateiinhalt geben, weil es nur ein generisches Download-Angebot ist - so verstehe ich Patricks Startposting jedenfalls.

        Anders herum: 'Man könne die Datei nur noch speichern, aber nicht mehr öffnen und "nur ansehen"' hat er als Fehlerbeschreibung bekommen. Aber mit welchem Programm soll denn nur eine unspezifizierte Binärdatei geöffnet/angesehen werden? MMn verhält sich der IE vollkommen richtig.

        Außerdem gibt es im IE + OE Sicherheitseinstellungen, die das Öffnen derartiger Downloads und Attachments unterdrücken. Die sind out-of-the-box auf "Ablehnen" eingestellt.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallöchen,

          vielen Dank soweit schonmal für eure Antworten. Das grundsätzliche Download-Script habe ich seinerzeit zum Großteil von php.net genutzt:
          http://php.net/manual/en/function.readfile.php

          Dort wird sinngemäß beschrieben, dass der octet-stream dazu führt, dass eben ein Download-Dialog forciert wird, anstatt einer direkten Dateiöffnung, wie es ja ggf. browserseitig eingestellt ist. Mit .htaccess-Dateien habe ich ja ebenfalls die Möglichkeit zu sagen, dass besteimmte Dateitypen bitte als Download-Hinweis zu behandeln sind. Diese Möglichkeit fällt nur dann weg, wenn die Datei außerhalb des Webroots liegt, weshalb ich ja das Download-Script starte.

          Wie gesagt, lief jahrelang alles einwandfrei und auch bzgl. des IE hatte ich nie klagen, wobei ich das auch ewig nicht mehr weiter geprüft habe. Nun kam eben diese Frage auf.

          Deine Ausführungen, Tom, sind prinzipiell einleuchtend, es wundert mich nur, dass eben nur der IE so reagiert. Selbst auf meinem Telefon funktioniert alles einwandfrei, außer dass er dort nach dem Download direkt das Anzeigeprogramm öffnet.

          Gruß Patrick

          1. Hello,

            Deine Ausführungen, Tom, sind prinzipiell einleuchtend, es wundert mich nur, dass eben nur der IE so reagiert. Selbst auf meinem Telefon funktioniert alles einwandfrei, außer dass er dort nach dem Download direkt das Anzeigeprogramm öffnet.

            Der IE hat eventuell noch etliche Male Updates verpasst bekommen, sodass Du das Downloadverhalten vor 10 Jahren nicht mit dem von heute vergleichen kannst.

            Icb habe gerade einen frischen Rechner mit IE6 (nicht lachen, brauch ich leider immer noch) auf WinXP PRO SP3 aufsetzen müssen. Updates sind absichtlich ausgeschaltet. Der ist also noch unverdorben schlecht.

            Nenn mir doch mal eine URL, von der ich das testen kann.

            Vielleicht fügt ja auch Dein Webserver irgendwelche Header hinzu. Das sollte man dann auch mal untersuchen.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo Tom,

              ja klar, manchmal macht es durchaus Sinn auch auf älteren Basen zu testen. Ich teste die meisten Sieten auch nochmal überfliegend auf dem IE 6, allerdings habe ich inzwischen aufgehört explizit für den mitzuentwickeln.

              Das aktuelle Script ist jetzt etwa 3, 4 Jahre alt... also so ewig dann auch noch nicht.

              Bzgl der URL melde ich mich morgen dann am besten mal per eMail. Ich setze mal ne simple Seite auf, wo das Script genutzt wird.

              Danke,

              Gruß Patrick