Johann: Downloadscript

Hallo,

ich habe vor ein paar Tagen schonmal wegen einem Downloadscript um Hilfe gebeten. Es ging um ein paar Verständnisfragen.

Eigentlich dachte ich das ich es gerafft habe, aber leider will es nicht funktionieren.
Also gegeben sei der Fall das die Dateien zum Download folgende Pfadangaben haben: /ordner/download/
Das Download-Script hat den Namen download.php und den Pfad /ordner

Aufruf für den Download von Datei_1.zip ist
download.php?download=2881

Es wird zwar der Download-Dialog vom Browser aufgemacht, und speichern kann ich auch, aber leider wird nur eine 1 kb große Datei mit dem Namen der Datei gespeichert.

Frage 1: Was ist an diesem Quellcode falsch ?

<?
$download = $_GET['download'];
$basedir = "/ordner";
$filelist = array(
  "2881" => "download/Datei_1.zip",
  "2882" => "download/Datei_2.zip",
  "2883" => "download/Datei_3.zip",
  "2884" => "download/Datei_4.zip"
);
if (!isset($filelist[$download]))
  die("Datei $download ist nicht vorhanden.");
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);
header("Content-Type: application/zip");
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename="$save_as_name"");
readfile($filename);
?>

Frage 2:
Eigenlich wollte ich es so haben wie bei der Seite
http://www.winload.de/
Dort klickt man auf download, dann öffnet sich ein Fenster wo man den Speicherort auswählen kann und gut.
Beim Internet Explorer klappt es mit meinem Script genauso, aber beim Mozilla erkennt der Browser das Dateiformat nicht und muß mich vorher nochmal fragen was ich damit machen will, also speichern oder mit bestimmten Programm öffnen. Woran kann das liegen ? Ich habe es auch schon mit header("Content-Type: application/octet-stream"); ausprobiert.
Da passiert dasselbe.
An meinem Mozilla kann der Fehler nicht liegen, weil *.zip Dateien von http://www.winload.de/ auch erkannt werden.

mfg

Johann

  1. Hi,

    Es wird zwar der Download-Dialog vom Browser aufgemacht, und speichern kann ich auch, aber leider wird nur eine 1 kb große Datei mit dem Namen der Datei gespeichert.

    die da was beinhaltet?

    An meinem Mozilla kann der Fehler nicht liegen, weil *.zip Dateien von http://www.winload.de/ auch erkannt werden.

    Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      die da was beinhaltet?

      es wird die datei Datei_1.zip abgespeichert  und wenn ich sie öffnen will bekomme ich Fehler. Der Typ der Datei ist *.zip und es wird auch dem richtigen Programm bei mir zugeordnet, in diesem Fall WinRAR.

      Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.

      Du meinst application/octetstream oder application/zip ?
      Wie kann ich das denn bei winload feststellen, da kommt ja nur der Speicherdialog.

      mfg

      Johann

      1. Hi,

        es wird die datei Datei_1.zip abgespeichert  und wenn ich sie öffnen will bekomme ich Fehler. Der Typ der Datei ist *.zip und es wird auch dem richtigen Programm bei mir zugeordnet, in diesem Fall WinRAR.

        gsss. Dann öffne sie mal mit 'nem Texteditor.

        Untersuche den Unterschied der Rückgaben der beiden Mechanismen. Beachte insbesondere die Header.
        Du meinst application/octetstream oder application/zip ?

        application/octet-stream. Ich beziehe mich vor allem auf die Gesamtheit aller versendeten Header - augenscheinlich gibt es irgendwo einen Unterschied.

        Wie kann ich das denn bei winload feststellen, da kommt ja nur der Speicherdialog.

        Bau Dir einen Client, der die Header ausgibt, wenn Du noch keinen solchen hast.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          gsss. Dann öffne sie mal mit 'nem Texteditor.

          <br />
          <b>Warning</b>:  readfile() [<a href='http://www.php.net/function.readfile'>function.readfile</a>]: open_basedir restriction in effect. File(/ordner/Director_1.zip) is not within the allowed path(s): (/Pfad zu meinem account/) in <b>Pfad zu download.php</b> on line <b>24 </b><br />
          <br />
          <b>Warning</b>:  readfile(/ordner/Director_1.zip) [<a href='http://www.php.net/function.readfile'>function.readfile</a>]: failed to create stream: Operation not permitted in <b>Pfad zu download.php</b> on line <b>24</b><br />

          hm was heißt das im Klartext ?
          is not within the allowed path(s) ?

          mfg

          Johann

          1. Hi,

            hm was heißt das im Klartext ?

            dass die Sicherheitseinstellungen Deines Servers für Deinen Bedarf zu hoch sind. Wende Dich an den Adminsitrator des Servers.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hallo,

              habe gerade mit einem Technker gechattet, der meint eine Pfadangabe scheint nicht zu stimmen.
              Aber genaueres konnte er im chat auch nicht sagen er meint ich soll ne mail schreiben.
              SIeht irgendwer da eine falsche Pfadangabe?

              mfg

              Johann

              1. Hi,

                SIeht irgendwer da eine falsche Pfadangabe?

                ich weiß ja nicht, was für Dich falsch ist. Hat das Root-Verzeichnis der Festplatte(!) ein Verzeichnis namens "ordner"?

                Cheatah

                --
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hallo,

                  ...der Festplatte ?
                  Ich dachte basedir is mein DocumentRoot auf dem Server ?

                  mfg

                  Johann

                  1. Hallo,

                    na supi jetzt gehts, habe wohl eine falsche Pfadangabe gemacht.
                    Download funktioniert jetzt, leider kann mozilla immer noch nicht das Dateiformat direkt erkennen. Außerdem ist mir aufgefallen das die gesamte Größe der Downloads in meinem Mozilla Downloadmanager und bei dem von Opera nicht zu sehen sind.
                    Also z.B. 320kb of ??kb steht da.

                    mfg

                    Johann

                    1. Hallo Johann,

                      Download funktioniert jetzt, leider kann mozilla immer noch nicht das Dateiformat direkt erkennen.

                      Wenn Du die Datei mit welchem Content-Type auslieferst?

                      Außerdem ist mir aufgefallen das die gesamte Größe der Downloads in meinem Mozilla Downloadmanager und bei dem von Opera nicht zu sehen sind.
                      Also z.B. 320kb of ??kb steht da.

                      Du müsstest noch einen Header namens Content-Length mitschicken. Dieser Header enthält die Größe der Datei in Bytes. Die bekommst Du über filesize() heraus.

                      Viele Grüße,
                      Christian

                      1. Hallo

                        Wenn Du die Datei mit welchem Content-Type auslieferst?

                        sowohl mit application/zip als auch mit application/octet-stream

                        geht es nicht.

                        Du müsstest noch einen Header namens Content-Length mitschicken. Dieser Header enthält die Größe der Datei in Bytes. Die bekommst Du über filesize() heraus.

                        Das klappt super, danke.

                        mfg

                        Johann

                        1. Hallo Johann,

                          [Mozilla Dateiformat erkennen]
                          sowohl mit application/zip als auch mit application/octet-stream
                          geht es nicht.

                          Wenn Du eine Hilfsanwendung für application/zip eingestellt hast, dann funktioniert das eigentlich, andernfalls natürlich nicht.

                          Viele Grüße,
                          Christian

                          1. Hi,

                            Wenn Du eine Hilfsanwendung für application/zip eingestellt hast, dann funktioniert das eigentlich, andernfalls natürlich nicht.

                            Eine Hilfsanwendung? Was meinst du damit ?

                            Octet-stream sollte doch eigentlich funktionieren.
                            Dialogbox von Mozilla sagt:
                            The File:"xxx.zip" is of type application/octet-stream,
                            and Mozilla does not know how to handle this file type. This
                            file is located at:
                            http://xxx/xxx

                            und dann das normale soll ich es mit einer Anwendung öffnen oder soll ich das File Speichern.

                            Seltsam seltsam.

                            mfg

                            Johann

                            1. Hallo Johann,

                              Eine Hilfsanwendung? Was meinst du damit ?

                              Bearbeiten -> Einstellungen -> Navigator -> Hilfsanwendungen

                              Octet-stream sollte doch eigentlich funktionieren.

                              Tut es doch auch:

                              Dialogbox von Mozilla sagt:
                              The File:"xxx.zip" is of type application/octet-stream,
                              and Mozilla does not know how to handle this file type. This
                              file is located at:
                              http://xxx/xxx

                              und dann das normale soll ich es mit einer Anwendung öffnen oder soll ich das File Speichern.

                              Ja und? Wo ist das Problem dabei? Du octet-stream heißt ja nichts anderes als eine folge von "octets", was in diesem Kontext als "Bytes" zu interpretieren ist. octet-stream kann also _alles_ sein. ZIP, BMP, EXE(PE), ELF-Binärdatei, etc. Klar, dass Mozilla sich weigert, eine Default-Aktion durchzuführen, außer Du stellst sie an oben genannter Stelle explizit ein.

                              Viele Grüße,
                              Christian

  2. Hiho

    Zu 1)
    Kann es sein das readfile() eine Datei nicht direkt ausgibt? Probier mal statt readfile($filename) folgendes:

    $read = fopen($filename, 'r');
    fpassthru($read);

    Grüsse

    1. Hallo

      Zu 1)
      Kann es sein das readfile() eine Datei nicht direkt ausgibt? Probier mal statt readfile($filename) folgendes:

      $read = fopen($filename, 'r');
      fpassthru($read);

      Hat leider auch nicht geklappt.

      mfg

      Johann

  3. Habe deine anderen Beiträge nicht gelesen... aber da ich schon mal ein ähnliches Problem hatte hier zwei Ideen:

    • application/octetstream (ohne -)
    • php-script ohne .php benennen und dann mit htaccess ForceType machen, damit es trotzdem ausgeführt wird..

    hat bei mir funktioniert...

    Gruss Michael

    1. Hi,

      • application/octetstream (ohne -)

      dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.

      • php-script ohne .php benennen und dann mit htaccess ForceType machen, damit es trotzdem ausgeführt wird..

      Boah. Du spekulierst auf Browser-Bugs. Das Problem ist: Speichern können sie eigentlich alle.

      Cheatah

      --
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hallo

        dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.

        und gerade deshalb funktioniert er so gut - unbekannt => download

        Boah. Du spekulierst auf Browser-Bugs. Das Problem ist: Speichern können sie eigentlich alle.

        hatte (soweit ich mich erinnern mag) bei netscape 6.x und 7.x das Problem, dass er die Dateien immer name.endung.php nennen wollte..

        mfg
        Michael

        1. Hallo Michael,

          dieser MIME-Type ist nicht registriert und damit, zumal er kein "x-" zu Beginn des Untertyps enthält, ungültig.
          und gerade deshalb funktioniert er so gut - unbekannt => download

          Wenn du einen unbekannten Dateityp angeben willst, um den IE auszutricksen, dann greife *BITTE* auf application/x-irgendwas, also z.B. application/x-web-download oder auch application/x-octetstream oder sonstwas, was Du willst, zurück. Aber application/octetstream ist nicht nur _unbekannt_, sondern zusätzlich _ungültig_.

          Viele Grüße,
          Christian

          1. Hallo Christian,

            Wenn du einen unbekannten Dateityp angeben willst, um den IE auszutricksen, dann greife *BITTE* auf application/x-irgendwas, also z.B. application/x-web-download oder auch application/x-octetstream oder sonstwas, was Du willst, zurück. Aber application/octetstream ist nicht nur _unbekannt_, sondern zusätzlich _ungültig_.

            Es geht zwar um alles andere, als den IE (der machts mit application/x-msdownload perfekt...), aber natürlich hast du recht... ist mit x- wohl sauberer und funktioniert auch! Thx!

            mfg
            Michael

    2. Hi,

      • application/octetstream (ohne -)
      • php-script ohne .php benennen und dann mit htaccess ForceType machen, damit es trotzdem ausgeführt wird..

      ...bei mir ergibt es dieselben Fehler, leider.

      mfg

      Johann