Michael: Datei download

Hallo und guten Morgen,

ich habe ein riesen Problem:

ich will eine Datei herunterladen und diese soll auf Festplatte gespeichert werden über das Fenster "Speichern unter".

der Programcode lautet:

header("Content-type: application/force-download");
    header("Content-Disposition: filename=$Datei");
    header("Content-Description: Downloaded File");

readfile ($dir2.$Datei);

$dir2 = Pfadangabe: http://www.xyz.de/Pfad/
$Datei = Dateiname

wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.
Ich hoffe Ihr könnt mir helfen

  1. Hallo,

    Hallo und guten Morgen,

    ich habe ein riesen Problem:

    Teste es doch schrittweise. U.a. hängt das auch an der Dateiendung, aber auch am Contenttype. Wieso muss es denn über PHP laufen? Bei einem Word.doc zB. kommen Apache und Browser gut selbst miteinander klar.

    Gruß

    jobo

    1. Hallo,

      Hallo und guten Morgen,

      ich habe ein riesen Problem:

      Teste es doch schrittweise. U.a. hängt das auch an der Dateiendung, aber auch am Contenttype. Wieso muss es denn über PHP laufen? Bei einem Word.doc zB. kommen Apache und Browser gut selbst miteinander klar.

      es sind zip-Dateien gleichzeitig wird in einer Datenbank festgehalten wann und was heruntergalden wurde (dies funktioniert).

      Egal was ich mache, es werden immer die undefineirten Zeichen angezeigt anstatt das Dialog-Fenster "speichern unter".

      Gruß Michael

      1. Hello,

        Egal was ich mache, es werden immer die undefineirten Zeichen angezeigt anstatt das Dialog-Fenster "speichern unter".

        Das liegt aber eventuell auch an der Client-Einrichtung.

        Bei mir öffnet sich immer der Editor (Text-Pad), wenn ich den Download nur per Click auf den Link einer Zip-Ressource starte. Per Kontextmenu kann man den Download zwar gezielt in eine Datei leiten, aber es nervt trotzdem. Ich wollte auch immer noch herausfinden, durch welche Installation das gekommen ist und habe es daher noch nicht rückgängig gemacht. In Verdacht habe ich Adobe und Firefox. Es hat schließlich mal wunschgemäß funktioniert.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

          Egal was ich mache, es werden immer die undefineirten Zeichen angezeigt anstatt das Dialog-Fenster "speichern unter".

          Das liegt aber eventuell auch an der Client-Einrichtung.

          Bei mir öffnet sich immer der Editor (Text-Pad), wenn ich den Download nur per Click auf den Link einer Zip-Ressource starte. Per Kontextmenu kann man den Download zwar gezielt in eine Datei leiten, aber es nervt trotzdem. Ich wollte auch immer noch herausfinden, durch welche Installation das gekommen ist und habe es daher noch nicht rückgängig gemacht. In Verdacht habe ich Adobe und Firefox. Es hat schließlich mal wunschgemäß funktioniert.

          In IE, Opera, Safari treten die Probleme auch auf
          Gruß Michael

  2. Hello,

    ich will eine Datei herunterladen und diese soll auf Festplatte gespeichert werden über das Fenster "Speichern unter".

    der Programcode lautet:

    header("Content-type: application/force-download");
        header("Content-Disposition: filename=$Datei");
        header("Content-Description: Downloaded File");

    readfile ($dir2.$Datei);

    $dir2 = Pfadangabe: http://www.xyz.de/Pfad/
    $Datei = Dateiname

    wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.
    Ich hoffe Ihr könnt mir helfen

    Und wie lauten die ersten dieser "undefinierten Zeichen"?

    Funktionieren denn deine übrigen PHP-Scripte einwandfrei?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

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

      ich will eine Datei herunterladen und diese soll auf Festplatte gespeichert werden über das Fenster "Speichern unter".

      der Programcode lautet:
          header("Content-type: application/force-download");
          header("Content-Disposition: filename=$Datei");
          header("Content-Description: Downloaded File");
          readfile ($dir2.$Datei);
      $dir2 = Pfadangabe: http://www.xyz.de/Pfad/
      $Datei = Dateiname

      es sind zip-Dateien

      wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.
      Ich hoffe Ihr könnt mir helfen

      Und wie lauten die ersten dieser "undefinierten Zeichen"?

      Screenshot mit den undefinerten Zeichen

      Funktionieren denn deine übrigen PHP-Scripte einwandfrei?

      ja, der Resr läuft einwandfrei.

      Gruß Michael

      1. Hello,

        es sind zip-Dateien

        Ich hatte eine BOM in Verdacht. Aber es sieht eher so aus, als ob Dein Browser (welcher ist es?) die Ressource als text/plain darzustellen versucht...

        Hast Du mal einen anderen Browser versucht?

        Und was sagt das System (welches ist es? Win XP?) in seiner Assoziations-Einrichtung?
        (WinXP: Extras/Ordneroptionen/Dateitypen)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

          es sind zip-Dateien

          Ich hatte eine BOM in Verdacht. Aber es sieht eher so aus, als ob Dein Browser (welcher ist es?) die Ressource als text/plain darzustellen versucht...

          Hast Du mal einen anderen Browser versucht?

          Und was sagt das System (welches ist es? Win XP?) in seiner Assoziations-Einrichtung?
          (WinXP: Extras/Ordneroptionen/Dateitypen)

          Habe es in verscheidenen Browser und Win2000 und XP ausprobiert -> alles das gleiche!

          Gruß Michael

          1. Hello,

            Habe es in verscheidenen Browser und Win2000 und XP ausprobiert -> alles das gleiche!

            Dann schau Dir mal die Response-Headers an.
            Geht ja bei Firefox recht bequem mit der Headers Extension
            https://addons.mozilla.org/en-US/firefox/addon/3829

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

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

        Und wie lauten die ersten dieser "undefinierten Zeichen"?
        Screenshot mit den undefinerten Zeichen

        es sieht so aus, als ob du erst die Zeilen

        TESCHT
        Email: abc@abc.abc
        Datei: ReadmeS7.zip
        http://www.mattke.de/Eingang/Download/Software/Programmbeispiele/ReadmeS7.zip
        http://www.mattke.de/Eingang/Download/Software/Programmbeispiele/ReadmeS7.zip

        ausgibst, und danach erst versuchst, deine Header zu senden und die Datei, die man zum Download ausgewählt hat. Das geht natürlich nicht: Mit der ersten Ausgabe von Nutzdaten (hier: der String "TESCHT") werden die bis dahin entweder von dir oder von PHP als Default vorgemerkten Header gesendet und der Datenblock begonnen.
        Später gesendete Header können nicht mehr berücksichtigt werden und werden von PHP ignoriert. Mit einer sinnvollen Einstellung des Error Reporting würdest du auch die zugehörigen Warnungen sehen, wie ich schon beschrieben habe.

        Was schwebt dir überhaupt für eine Logik vor, Textausgaben und zip-Download zu mischen? Entweder das eine, oder das andere.

        So long,
         Martin

        --
        TEAM: Toll, Ein Anderer Macht's.
        1. TESCHT
          Email: abc@abc.abc
          Datei: ReadmeS7.zip
          http://www.mattke.de/Eingang/Download/Software/Programmbeispiele/ReadmeS7.zip
          http://www.mattke.de/Eingang/Download/Software/Programmbeispiele/ReadmeS7.zip

          ausgibst, und danach erst versuchst, deine Header zu senden und die Datei, die man zum Download ausgewählt hat. Das geht natürlich nicht: Mit der ersten Ausgabe von Nutzdaten (hier: der String "TESCHT") werden die bis dahin entweder von dir oder von PHP als Default vorgemerkten Header gesendet und der Datenblock begonnen.
          Später gesendete Header können nicht mehr berücksichtigt werden und werden von PHP ignoriert. Mit einer sinnvollen Einstellung des Error Reporting würdest du auch die zugehörigen Warnungen sehen, wie ich schon beschrieben habe.

          Was schwebt dir überhaupt für eine Logik vor, Textausgaben und zip-Download zu mischen? Entweder das eine, oder das andere.

          Die Anzeige sind nur dazu gedacht zur Kontrollanzeige, im eigentlichen Betrieb sollen die auch nicht mehr zusehen sein.
          Dann werd ich es ohne Anzeige mal ausprobieren uns sehen was passiert.

          Gruß Michael

  3. Moin,

    header("Content-type: application/force-download");

    diesen Content-Type gibt es nicht - meintest du vielleicht application/octet-stream? Die HTTP-Spezifikation sagt zwar aus, dass ein Client bei einem ihm unbekannten Content-Type selbst entscheiden kann, wie er die Ressource verarbeitet, und die meisten UAs werden sie wohl zum Speichern anbieten. Aber warum nicht gleich richtig?

    header("Content-Disposition: filename=$Datei");

    Da fehlt was:  Content-Disposition: attachment; filename=$Datei

    header("Content-Description: Downloaded File");

    Kann man machen, ist aber sehr ungewöhnlich. Ich würd's weglassen.

    readfile ($dir2.$Datei);

    wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.

    Macht dein Script etwa vor den header-Anweisungen schon irgendeine Ausgabe, und sei es eine Leerzeile? Das würde dann dazu führen, dass keine Header mehr gesendet werden. Dann solltest du allerdings auch eine Meldung (Warning) bekommen: Headers already sent.

    So long,
     Martin

    --
    Lieber blau machen, als sich schwarz ärgern.
    1. Moin,

      header("Content-type: application/force-download");

      diesen Content-Type gibt es nicht - meintest du vielleicht application/octet-stream? Die HTTP-Spezifikation sagt zwar aus, dass ein Client bei einem ihm unbekannten Content-Type selbst entscheiden kann, wie er die Ressource verarbeitet, und die meisten UAs werden sie wohl zum Speichern anbieten. Aber warum nicht gleich richtig?

      header("Content-Disposition: filename=$Datei");

      Da fehlt was:  Content-Disposition: attachment; filename=$Datei

      header("Content-Description: Downloaded File");

      Kann man machen, ist aber sehr ungewöhnlich. Ich würd's weglassen.

      readfile ($dir2.$Datei);

      wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.

      Macht dein Script etwa vor den header-Anweisungen schon irgendeine Ausgabe, und sei es eine Leerzeile? Das würde dann dazu führen, dass keine Header mehr gesendet werden. Dann solltest du allerdings auch eine Meldung (Warning) bekommen: Headers already sent.

      So long,
      Martin

      Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.
      Eine Warnung bekomme ich keine.

      Habe die oben aufgeführten Änderungen gemacht -> das gleiche Problem.

      1. Hello,

        Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.
        Eine Warnung bekomme ich keine.

        Habe die oben aufgeführten Änderungen gemacht -> das gleiche Problem.

        Ist der Webserver öffentlich? Dann gib uns doch mal einen Link auf eine Musterressource, die bei Dir entsprechend deiner Beschreibungen verarbeitet wird.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

          Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.
          Eine Warnung bekomme ich keine.

          Habe die oben aufgeführten Änderungen gemacht -> das gleiche Problem.

          Ist der Webserver öffentlich? Dann gib uns doch mal einen Link auf eine Musterressource, die bei Dir entsprechend deiner Beschreibungen verarbeitet wird.

          zum tsten:

          http://www.mattke.de/Eingang/Login/Login.php

          benutzer: abc@abc.abc
          passwort: abc

          -> Programmbeispiele und dort eines aussuchen.

          Gruß Michael

          1. Hello,

            da kommt auf den Request auf

            http://www.mattke.de/Eingang/Login/Liste_Prg_Beispiele.php?do=download&Datei=ReadmeS7.zip

            GET /Eingang/Login/Liste_Prg_Beispiele.php?do=download&Datei=ReadmeS7.zip HTTP/1.1
            Host: www.mattke.de
            User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
            Accept-Language: de-de,de;q=0.8,en-us;q=0.6,en;q=0.4,fr-fr;q=0.2
            Accept-Encoding: gzip,deflate
            Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
            Keep-Alive: 300
            Connection: keep-alive
            Referer: http://www.mattke.de/Eingang/Login/Liste_Prg_Beispiele.php
            Cookie: PHPSESSID=e61bd1fa0eb77066d6ab0179b39ca1bd

            HTTP/1.x 200 OK
            Date: Wed, 18 Nov 2009 10:26:40 GMT
            Server: Apache
            Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
            Expires: Thu, 19 Nov 1981 08:52:00 GMT
            Pragma: no-cache
            X-Powered-By: PHP/4.4.9
            Keep-Alive: timeout=2, max=200
            Connection: Keep-Alive
            Transfer-Encoding: chunked
            Content-Type: text/html

            Von deinen Headern ist da nichts zu sehen.
            Der übermittelte Content löast dann auch noch Folgerequests aus.

            Das angesprochene Script scheint das wohl zu vergessen:

            Liste_Prg_Beispiele.php?do=download&Datei=ReadmeS7.zip

            Sieht sowieso irgendwie gefährlich aus, dass der Dateiname da im Klartext drinsteht. Da kommen bei mir immer Vermutungen auf, dass man x-beliebige Dateien runterladen könnte...

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

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

        »

        Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.
        Eine Warnung bekomme ich keine.

        sind warnungen eingeschaltet? wird vorher ein blank (bom) ausgegeben?

        Gruß

        jobo

      3. Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.

        Und genau diese Bildschirmausgabe verhindert dein Download.

        1. Hello,

          Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.

          Und genau diese Bildschirmausgabe verhindert dein Download.

          Das angesprochene Script macht aber nicht das, was Michael uns hier gepostet hat. Von den vorgesehen Headern wird kein einziger gesendet!

          siehe https://forum.selfhtml.org/?t=192771&m=1286889

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Das angesprochene Script macht aber nicht das, was Michael uns hier gepostet hat. Von den vorgesehen Headern wird kein einziger gesendet!

            Richtig, kann ja auch gar nicht, da vor dem header() bereits Daten zum Client gesendet wurden.

            1. Hello,

              Das angesprochene Script macht aber nicht das, was Michael uns hier gepostet hat. Von den vorgesehen Headern wird kein einziger gesendet!

              Richtig, kann ja auch gar nicht, da vor dem header() bereits Daten zum Client gesendet wurden.

              Dann müsste das Script mit einer Fehlermeldung reagieren, wenn die nicht alle ausgeschaltet sind.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Dann müsste das Script mit einer Fehlermeldung reagieren, wenn die nicht alle ausgeschaltet sind.

                In diesem Fall sind diese augenscheinlich alle abgeschaltet.

        2. Hallo,

          Was für eine Ausgabe? Wenn dann Bildschirmanzeige mit den Dateien die man herunterladen will.

          Und genau diese Bildschirmausgabe verhindert dein Download.

          Entweder Bildschirmausgabe, oder Download. Ein Link verweist auf eine Resource, die entweder im Browser angezeigt wird, oder von ihm heruntergeladen wird. Wenns hyroglyphen sind, wird vielleicht die Zip-Datei angezeigt.

          Gruß

          jobo

          1. Hi,

            Entweder Bildschirmausgabe, oder Download.

            das sagte ich auch gerade.

            Ein Link verweist auf eine Resource, die entweder im Browser angezeigt wird, oder von ihm heruntergeladen wird. Wenns hyroglyphen sind, wird vielleicht die Zip-Datei angezeigt.

            Ja. Die Zeichen "PK" markieren den Beginn des zip-Archivs.

            Ciao,
             Martin

            --
            Der Alptraum jedes Computers:
            "Mir war, als hätte ich gerade eine 2 gesehen."
  4. Hallo und guten Morgen,

    ich habe ein riesen Problem:

    ich will eine Datei herunterladen und diese soll auf Festplatte gespeichert werden über das Fenster "Speichern unter".

    der Programcode lautet:

    header("Content-type: application/force-download");
        header("Content-Disposition: filename=$Datei");
        header("Content-Description: Downloaded File");

    readfile ($dir2.$Datei);

    $dir2 = Pfadangabe: http://www.xyz.de/Pfad/
    $Datei = Dateiname

    wenn ich es so mache, dann werden nur undefinierte Zeichen auf den Bildschirm ausgegeben.
    Ich hoffe Ihr könnt mir helfen

    Hier ist der Test-Zugang:
    http://www.mattke.de/Eingang/Login/Login.php
    benutzer: abc@abc.abc
    passwort: abc
    -> Programmbeispiele und dort eines aussuchen.

  5. Hallo Michael,

    Neben dem was im restlichen Thread schon geschrieben wurde:

    readfile ($dir2.$Datei);

    $dir2 = Pfadangabe: http://www.xyz.de/Pfad/
    $Datei = Dateiname

    Warum greifst du per http auf die Datei zu wenn du doch direkt über das Dateisystem darauf zugreifen könntest?

    Gruß,
    Tobias

    1. Hello Tobias,

      Neben dem was im restlichen Thread schon geschrieben wurde:

      readfile ($dir2.$Datei);

      $dir2 = Pfadangabe: http://www.xyz.de/Pfad/
      $Datei = Dateiname

      Warum greifst du per http auf die Datei zu wenn du doch direkt über das Dateisystem darauf zugreifen könntest?

      Das ist überhaupt wahr!
      Genau DAS will er ja gerade NICHT.

      Und bei der Gelegenheit nochmals daran erinnert, dass $Datei, die ja von außen kommt, auf jeden Fall vorbehandelt werden muss, wenn Michael sich nicht eine Sicherheitslücke ins System reißen will.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

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