Downloadscript beschädigt Bilddateien

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Downloadscript beschädigt Bilddateien

    Ich habe ein PHP Script welches hochgeladene Dateien zum download anbietet.

    Ich habe Probleme wenn Bilddateien hochgeladen werden, egal ob .jpg .gif. etc: Nach dem Download sind die Bilddateien beschädtig -> Keine Vorschau verfügbar. Auch .msi oder .exe Dateien sind nicht ausführbar/beschädigt.

    .pdf Dateien zb. lassen sich nach dem Download komischerweise problemlos ausführen.

    Ich habe mal eine heruntergeladene .png Datei mit einem Hex-Editor angesehen und herausgefunden das zusätzlich zwei Hex Werte mit dem Download mitgegeben werden.
    Denn PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.

    Das ist das Download Script:
    PHP-Code:
    <?php
    include_once("../upload/online.php");
    $hash $_GET['hash'];

            
    $sql "SELECT link FROM links WHERE hash = '".$hash."';";
            
    $query mysql_query($sql);
            
            
    $result mysql_fetch_assoc($query);
            
    $url $result['link'];

            
            
    $ext "SELECT filetype FROM links WHERE hash = '".$hash."';";
            
    $query mysql_query($ext);
            
            
    $result mysql_fetch_assoc($query);
            
    $filetype $result['filetype'];
            
            
    $dir "../upload/"
        if ((isset(
    $url))&&(file_exists($dir.$url))) { 
           
    header("Content-type: octet/stream"); 
           
    header("Content-length: ".filesize($dir.$url.$filetype)); 
           
    header('Content-Disposition: attachment; filename="download.'.$filetype.'"'); 
           
    readfile("$dir$url"); 
        } else { 
           echo 
    "No file selected"
        } 
    ?>
    Wenn ich die hochgeladene Datei direkt vom Zielverzeichnis manuell herunterlade funktioniert es. Also es liegt an diesem Script. Nur an was?
    Zuletzt geändert von unixp; 24.03.2011, 08:13.

  • #2
    Morgen.

    Schau Dir mal die Diskussion zu dem Thema und zu [COLOR=Black][COLOR=#000000][COLOR=#CC0000]Content-type: octet/stream[/COLOR][/COLOR][/COLOR] an:

    Wie kann ich Download erzwingen? - homepage-forum.de - Hilfe für Webmaster!

    mfg streuner
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

    Kommentar


    • #3
      wird der nicht sowieso
      PHP-Code:
      header("Content-Type: application/octet-stream"); 
      geschrieben ?
      [font=Verdana]
      Wer LESEN kann, ist klar im Vorteil!
      [/font]

      Kommentar


      • #4
        ...genau das meinte ich.

        mfg streuner
        Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
        der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

        "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

        Kommentar


        • #5
          Gut habe ich geändert. Aber immer noch das gleiche Problem.

          Würde es was bringen wenn man alle einzelnen mime Werte manuell in das Script hinzufügt?

          PHP-Code:
          header('Content-type: {mime}'); //hier mime eintragen 
          [COLOR=#000000][COLOR=#FF8000]

          [/COLOR][/COLOR]{mime} = ersetzen durch mime, siehe: PluginDoc: Windows (Liste der MIME-Typen)

          Edit:
          ok an dem liegts auch nicht. Habe zum testen mal
          PHP-Code:
                 header("Content-Type: image/jpeg"); 
                 
          header("Content-Type: image/jpg"); 
          und eine jpeg Datei heruntergeladen -> Keine Vorschau verfügbar.
          Zuletzt geändert von unixp; 24.03.2011, 08:49.

          Kommentar


          • #6
            Versuch das sonst mal so aufzubauen dein Script:

            Dateifunktionen und Programmausführung - Wie realisiere ich einen Dateidownload mit PHP?

            Alternative:

            Datei-Download mit PHP erzwingen

            mfg streuner
            Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
            der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

            "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

            Kommentar


            • #7
              Habe es mal wie im ersten Link aufgebaut. Allerdings speichert er jetzt alle Dateien mit genau 9bytes ab.

              Mein Code:
              PHP-Code:
              <?php
              include_once("../upload/online.php");
              $hash $_GET['hash'];

                      
              $sql "SELECT link FROM links WHERE hash = '".$hash."';";
                      
              $query mysql_query($sql);
                      
                      
              $result mysql_fetch_assoc($query);
                      
              $url $result['link'];

                      
                      
              $ext "SELECT filetype FROM links WHERE hash = '".$hash."';";
                      
              $query mysql_query($ext);
                      
                      
              $result mysql_fetch_assoc($query);
                      
              $filetype $result['filetype'];
                      
                      
              $dir "../upload/"
                      
                      
              $dateiname basename($url);
                      
              $groesse filesize($dir.$url.$filetype);
                      
                      
                      
              header("Content-Type: application/octet-stream");
                      
              header('Content-Disposition: attachment; filename="download.'.$filetype.'"'); 
                      
              header("Content-Length:".$groesse);
                      
              readfile($dir.$url.$filetype);
              ?>

              Kommentar


              • #8
                also ich liefere alle Dateien mit folgenden Code-Zeilen aus , egal was für ein Dateityp

                PHP-Code:
                        $Dateiname basename($Datei);
                        
                $Groesse filesize($Datei);
                        
                $file=fopen($Datei,'r');
                        if (
                $file) {
                            
                header("Pragma: public");
                            
                header("Expires: 0");
                            
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                            
                header("Cache-Control: private",false);
                            
                header("Content-Type: application/force-download");
                            
                header("Content-Type: application/octet-stream");
                            
                header("Content-Type: application/download");
                            
                header("Content-Disposition: attachment; filename=\"".$Dateiname."\";");
                            
                header("Content-Description: File Transfer");
                            
                header("Content-Transfer-Encoding: binary");
                            
                header('Content-Length: '.$Groesse );
                            
                flush();
                            while (!
                feof($file)) {
                                print(
                fread($file,4096));
                                
                flush();
                            }
                        }
                        
                fclose($file);
                        die(); 
                an diesen Script-block übergibst du als $Datei den Pfad incl. Dateinamen (zb "/home/www/files/123.jpg" ) und den Rest machen die Header -Anweisungen ...

                Nicht erschrecken, dass es soviele sind ... aber das war nötig, weil mein Script auch mitm IE 6 arbeiten muss .. Firefox kommt mit erheblich weniger Anweisungen aus, macht aber mit diesem Header-Aufruf auch das, was er soll

                und bevor du fragst... erfolgreich getestet mit
                Word-Dateien, Anwendungen, PDF, Bilder (png , jpeg, gif), CSV für Excel
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9
                  Ich habe mal diverse Content-Types getestet.
                  Aktuell hab ich die Konfig so:

                  PHP-Code:
                  <?php
                  include_once("../upload/online.php");
                  $hash $_GET['hash'];

                      
                  $sql "SELECT link FROM links WHERE hash = '".$hash."';";
                      
                  $query mysql_query($sql);
                     
                      
                  $result mysql_fetch_assoc($query);
                      
                  $url $result['link'];

                     
                      
                  $ext "SELECT filetype FROM links WHERE hash = '".$hash."';";
                      
                  $query mysql_query($ext);
                     
                      
                  $result mysql_fetch_assoc($query);
                      
                  $filetype $result['filetype'];
                     
                      
                  $dir "../upload/";
                      if ((isset(
                  $url))&&(file_exists($dir.$url))) {
                              
                  header("Pragma: public");
                              
                  header("Expires: 0");
                              
                  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                              
                  header("Cache-Control: private",false);
                              
                  header("Content-Type: application/force-download");
                              
                  header("Content-Type: application/octet-stream");
                              
                  header("Content-Type: application/download");
                              
                  header("Content-length: ".filesize($dir.$url));
                              
                  header("Content-Disposition: attachment; filename=\"".$url."\";");
                              
                  header("Content-Description: File Transfer");
                              
                  header("Content-Transfer-Encoding: binary");
                              
                  readfile("$dir$url");
                      } else {
                         echo 
                  "No file selected";
                      }
                  ?>
                  Die config ähnelt deiner. Ich verstehe bloss nicht wo er etwas dem Download "mitgibt" damit es nicht funktioniert und die Dateien beschädigt sind.

                  Kommentar


                  • #10
                    Zitat von unixp Beitrag anzeigen
                    Ich habe mal eine heruntergeladene .png Datei mit einem Hex-Editor angesehen und herausgefunden das zusätzlich zwei Hex Werte mit dem Download mitgegeben werden.
                    Und welche ...?
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Und welche ...?
                      Ich erhalte den zusätzlichen Wert 20 0A 0A, siehe:

                      http://www.abload.de/img/hexcode1dfc.jpg

                      PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.

                      Bloß wodurch wird das ausgelöst?

                      Kommentar


                      • #12
                        Zitat von unixp Beitrag anzeigen
                        Ich erhalte den zusätzlichen Wert 20 0A 0A
                        Also ein Leerzeichen und zwei Linefeeds.

                        Bloß wodurch wird das ausgelöst?
                        Vermutlich dadurch, dass es irgendwo in deinem PHP-Script drin steht - außerhalb der <?php ... ?>-Bereiche.

                        Dass du damit keine “headers already sent”-Fehlermeldung bekommst, liegt wohl an aktiviertem output buffering. (Wenn du die Stelle also nicht selber findest, dann output buffering mal deaktivieren - dann wird die Meldung dich darauf hinweisen, an welcher Stelle diese Ausgabe stattfand.)
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Ich habe in der /etc/php5/apache2/php.ini das output_buffering von 4096 auf Off gestellt.

                          Ich erhalte dann beim Download nur Hieroglyphen im Fenster als Ausgabe.

                          Ich habe nochmal das komplette Script auf falsche Leerzeichen und Umbrüche geprüft aber nichts gefunden...

                          Kommentar


                          • #14
                            Zitat von unixp Beitrag anzeigen
                            PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.
                            Also crosspostings find ich ja schon frech - aber der hier ist besonders frech...

                            In diesem Thread steht:

                            Zitat von Jens Clasen
                            PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei Dir steht was davor, und das ist für Deine Probleme verantwortlich.

                            In Deinem Fall halt ein Leerzeichen (0x20) hinter ?> und drei Zeilenumbrüche (0x0A) danach. Im Include stehen keine mehr - das würde man im Hexeditor sonst gesehen haben.
                            Dazu fällt mir langsam nichts mehr ein...

                            Gruß Jens

                            Kommentar


                            • #15
                              dann guck auch mal was VOR <?PHP steht ^^

                              ein Leerzeichen und 2 mal Enter vermutlich
                              [font=Verdana]
                              Wer LESEN kann, ist klar im Vorteil!
                              [/font]

                              Kommentar

                              Lädt...
                              X