Andreas: Probleme mit Download-Script

Hallo, folgendes Download-Script:

function download_file() {
    global $mkportals, $DB, $mklib, $mklib_board;
    $file= $mkportals->input['file'];
    $ide= $mkportals->input['ide'];
    $query = $DB->query( "SELECT downloads FROM mkp_download where id = '$ide'");
    $row = $DB->fetch_row($query);
    $downloads = $row['downloads'];
    ++$downloads;
    $DB->query("UPDATE mkp_download SET downloads ='$downloads'  where id = '$ide'");
    $DB->close_db();
    $real_file = "mkportal/modules/downloads/file/mk_".$ide."_".$file;
    $real_file = preg_replace("(.\*)\..\*", "\1", $real_file);
    $real_file .= ".mk";
    if (is_file("mkportal/modules/downloads/file/".$file)) {
        rename("mkportal/modules/downloads/file/".$file, $real_file);
    }
    @header( "Content-Type: application/octet-stream\nContent-Disposition: inline; filename="".$file.""\nContent-Length: ".(string)(filesize( $real_file ) ) );
    $fh = fopen( $real_file, 'rb' );
    fpassthru( $fh );
    @fclose( $fh );
    exit();
}

Das Problem ist nun dass wenn die Datei die heruntergeladen werden soll z.B. eine .txt Datei ist, das sie nicht gespeichert wird sondern der Inhalt der .txt-Datei angezeigt wird.

Ich habe versucht den header zu ändern ohne Erfolg.
Wie muss es lauten damit auch text-Dateien heruntergeladen werden können.

Das Seltsame ist im Firefox funktioniert das Script problemlos.
Nur im Internetexplorer (6.0.2900.xxx SP2) funktioniert es nicht.

Gruß Andreas

  1. Ich bin mir jetzt nicht zu 100% sicher, aber ich denke als "Webmaster" kann man das nicht beeinflussen, genau so wenig wie man beeinflussen kann, dass der IE .doc-Dateien intern in einem MS-Word-Fenster öffnet.
    Das ist meines Erachtens nach eine clientseitige Story.
    Korrigiert mich wenn ich falsch liege
    lg Gerhard

    1. Ich bin mir jetzt nicht zu 100% sicher, aber ich denke als "Webmaster" kann man das nicht beeinflussen, genau so wenig wie man beeinflussen kann, dass der IE .doc-Dateien intern in einem MS-Word-Fenster öffnet.
      Das ist meines Erachtens nach eine clientseitige Story.
      Korrigiert mich wenn ich falsch liege
      lg Gerhard

      Hallo,
      Gerhard hat ziemlich recht, d.h. das wenn ein TXT oder z.B. DOC oder EXL-File gesendet wird, wird der liebe IE erst versuchen, die Datei direkt darzustellen. Wir haben einmal für ein Projekt das gleiche Problem gehabt und nur über den Umweg der Kompremierung (d.h. wir wandeln serverseitig das File in ein ZIP um) gelösst.
      Gruss
      Georg

      1. Hallo,
        aber es geht doch irgendwie.
        Wenn ich im Forum das von SMF ist ein txt-upload mache kann ich es auch mit dem IE als txt-File herunterladen.

        Andreas

        1. Hallo,
          aber es geht doch irgendwie.
          Wenn ich im Forum das von SMF ist ein txt-upload mache kann ich es auch mit dem IE als txt-File herunterladen.

          Andreas

          Hallo,
          der einzige Weg ist der einen "verhunzten" Header zu senden, nur das ist nicht wirklich empfehlenswert, da weder konform noch Browserübergreifend.
          Gruss
          Georg

          1. Hi,

            der einzige Weg ist der einen "verhunzten" Header zu senden, nur das ist nicht wirklich empfehlenswert, da weder konform noch Browserübergreifend.

            Gibt es denn einen Browser, mit dem mein Listing nicht funktioniert?

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            1. Hallo,
              danke für eure Antworten.

              @Cybaer: danke für den Header, werde ihn heute Abend noch testen und Bescheid geben.

              Andreas

  2. Hi,

    Hallo, folgendes Download-Script:

    Ich mal folgendes geschrieben:

    header('Content-Transfer-Encoding: none');
     header('Content-type: application/x-download');
     header('Content-Disposition: attachment; filename='.basename($serverFile).';');
     header('Accept-Ranges: bytes');
     header('Content-length: '.filesize($serverFile));
     readfile($serverFile);

    Und das klappt auch auf dem IE mit .txt-Dateien.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. Hallo,
      der Header hat klasse funktioniert, vielen Dank fafür.
      Musste nur readfile($serverFile); weglassen und fertig.

      Gruß Andreas

    2. Ahoi Cybaer,

      header('Content-Transfer-Encoding: none');

      was macht das? find hier nix zu

      http://de2.php.net/manual/de/function.header.php

      header('Accept-Ranges: bytes');

      was macht das?

      header('Content-length: '.filesize($serverFile));

      wie ermittle ich die dateigröße einer nichtvorhandenen datei? also die
      datei liegt nicht auf dem server sondern wird dynamisch in einen
      string geschrieben.

      readfile($serverFile);

      stattdessen hab ich dann echo.

      MfG

      --
      Alle Angaben wie immer ohne Gewähr
      \     \           /    /              \    \          /     /
       \     \         /    /                \    \        /     /
        \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
        |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
        l    l   .l.   \   \                 /   /   .l.   1    1
        l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
        \                                                       /
      1. Hi,

        header('Content-Transfer-Encoding: none');
        was macht das? find hier nix zu

        Fauler Sack! >:->

        535.000 Google-Einträge zu "Content-Transfer-Encoding none".

        header('Accept-Ranges: bytes');
        was macht das?

        77.900 Einträge zu "Accept-Ranges: bytes"

        header('Content-length: '.filesize($serverFile));
        wie ermittle ich die dateigröße einer nichtvorhandenen datei? also die
        datei liegt nicht auf dem server sondern wird dynamisch in einen
        string geschrieben.

        Und der hat welche Länge? Die man mit welchem Befehl ermittelt? (Google: "PHP Stringlänge ermitteln -inurl:.php", 158 Einträge)

        Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)

        Gruß, Cy-"wer richtig suchet, der auch findet"-baer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)

          Oder noch besser: "Romanes eunt domus"  8->

          Gruß, Cy-"das schreibst Du jetzt hundertmal"-baer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
          1. Hi,

            Oder noch besser: "Romanes eunt domus"  8->

            Halt, damit wird Ch. Schnauß bestimmt nichts anfangen können ... =;-)

            Gruß, Cy-"wieder eklatante Bildungslücke gefunden?"-baer ;-)

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        2. Ahoi Cybaer,

          Fauler Sack! >:->

          ja, manchmal lehn ich mich zu gerne zurück und frag einfach, frei nach
          dem motto "Wer wie was.. wer nicht fragt bleibt dumm." Hab ich in
          meiner Jugend sehr häufig gehört.

          Und der hat welche Länge? Die man mit welchem Befehl ermittelt? (Google: "PHP Stringlänge ermitteln -inurl:.php", 158 Einträge)

          filsize  Gibt die Größe einer Datei in Bytes zurück
          strlen  Gibt die Länge der Zeichenkette zurück.

          größe in bytes === länge der zeichenkette?

          Erinnert mich an "Die Feuerzangenbowle" ("Watt is' 'en Dampfmaschin'?" und "Aber jäder nor ein wänziges Schlöckchen!"). =;-)

          naja, "Wenn der Vater mit dem Sohne" war besser.

          MfG

          --
          Alle Angaben wie immer ohne Gewähr
          \     \           /    /              \    \          /     /
           \     \         /    /                \    \        /     /
            \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
            |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
            l    l   .l.   \   \                 /   /   .l.   1    1
            l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
            \                                                       /
          1. Hi,

            ja, manchmal lehn ich mich zu gerne zurück und frag einfach, frei nach
            dem motto "Wer wie was.. wer nicht fragt bleibt dumm." Hab ich in
            meiner Jugend sehr häufig gehört.

            Ja, damals gab es aber auch Google noch nicht! =8->

            filsize  Gibt die Größe einer Datei in Bytes zurück
            strlen  Gibt die Länge der Zeichenkette zurück.
            größe in bytes === länge der zeichenkette?

            Machst Du hier einen auf Realsatire? =;->

            naja, "Wenn der Vater mit dem Sohne" war besser.

            Pfh! >:-)

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            1. Ahoi Cybaer,

              Ja, damals gab es aber auch Google noch nicht! =8->

              AFAIK geht der text aber noch nicht "wer nicht googelt der bleibt dumm"

              filsize  Gibt die Größe einer Datei in Bytes zurück
              strlen  Gibt die Länge der Zeichenkette zurück.
              größe in bytes === länge der zeichenkette?
              Machst Du hier einen auf Realsatire? =;->

              nein die frage war ernst gemeint. nach einem test ergab strlen 1188
              abgespeichert und eigenschaft angekuckt stand da 1192. kurze
              überlegung dann zum ergebniss gekommen, die 1188 standen ja noch nicht
              drinsind 4 zeichen. was mich aber verwirrt ist dies hier (WinXP)

              Größe auf datenträger 4,00 KB (4.096 Bytes)

              wie kommt denn das zustanden? und was wäre jetzt die korekte angabe zu senden?

              naja, "Wenn der Vater mit dem Sohne" war besser.
              Pfh! >:-)

              wie hieß den gleich nochmal der schauspieler? Heinz Rühmann?
              leider ist er schon tot :(

              MfG

              --
              Alle Angaben wie immer ohne Gewähr
              \     \           /    /              \    \          /     /
               \     \         /    /                \    \        /     /
                \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
                |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
                l    l   .l.   \   \                 /   /   .l.   1    1
                l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
                \                                                       /
              1. Ahoi Daniel,

                nein die frage war ernst gemeint.

                ansich besteht ein zeichen ja aus 8bit, und 8bit sind 1byte. allerdings
                hab ich mal was von start-, stop- und kontrollbits was gehört.

                MfG

                --
                Alle Angaben wie immer ohne Gewähr
                \     \           /    /              \    \          /     /
                 \     \         /    /                \    \        /     /
                  \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
                  |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
                  l    l   .l.   \   \                 /   /   .l.   1    1
                  l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
                  \                                                       /
                1. Hi,

                  ansich besteht ein zeichen ja aus 8bit,

                  Meistens schon. Wenn nicht, dann greifen in PHP andere Befehle.

                  und 8bit sind 1byte. allerdings
                  hab ich mal was von start-, stop- und kontrollbits was gehört.

                  Im Zusammenhang mit Modems wahrscheinlich.

                  Gruß, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
              2. Hi,

                Größe auf datenträger 4,00 KB (4.096 Bytes)

                Bei dem Dateisystem (FS) der gespeicherten Datei die Größe einer Zuordnungseinheit.

                Die unterscheidet sich von FS zu FS und ist durchaus interessant und wichtig, für die Verarbeitung der Datei jedoch nicht.

                wie kommt denn das zustanden? und was wäre jetzt die korekte angabe zu senden?

                Die Dateilänge, also filesize() - oder eben strlen().

                wie hieß den gleich nochmal der schauspieler? Heinz Rühmann?
                leider ist er schon tot :(

                Alt ist er geworden ... :-)

                Gruß, Cybaer

                --
                Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  3. Ahoi Andreas,

    ich bin gerade etwas am experimentieren und habe hier, diesen "codeschnipsel" gefunden:

      
    if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))  
      header('Content-Type: application/force-download');  
    else  
      header('Content-Type: application/octet-stream');  
    
    

    was macht das? ist das hilfreich?

    MfG

    --
    Alle Angaben wie immer ohne Gewähr
    PPPS: ich trinke gerne ab und an mal eine tote Tante.
    1. Hi,

      if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))

      Wenn im UA "MSIE" vorkommt ...

      header('Content-Type: application/force-download');

      ... verwende einen erfundenen Content-Type (veranlaßt den IE zum "Speichern unter").

      else
        header('Content-Type: application/octet-stream');

      Sonst verwende den offiziellen CT für Binaerstreams (sollte bei "normalen" Browsern das "Speichern unter" veranlassen).

      was macht das? ist das hilfreich?

      Wie man's nimmt. Der Inhalt des UAs ist beliebig (auch beim IE) und jeder Browser bietet bei einen ihm unbekannten CT (üblicher- & logischerweise) an, ihn ggf. zu speichern. Ergo: Ich halte dieses Vorgehen für sinnlos bis fehleranfällig.

      Georg, der scheinbar die Befürchtung hat, daß Browser mit unbekannten Streams anders verfahren (oder aus Prinzip keine unbekannten CTs verwenden möchte), mag dies anders sehen. ;-)

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!