Externes Bild per PHP herunterladen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Externes Bild per PHP herunterladen

    Hallo,
    ich versuche mittels PHP externe Bilder auf meinen Server zu laden. Leider passiert es bei manchen Bildern, dass am unteren Teil ein schwarzer Balken auftritt. Hier mal ein Beispiel:

    Original: http://phys.bspu.unibel.by/hist/phys.../phys/hund.jpg
    Gespeicherte Version: http://www.pictureshunt.com/admin/hund-28.jpg

    Mein Code:
    PHP-Code:
    $data file_get_contents($external_file);
    file_put_contents($local_file$data); 
    Habe schon diverse Methoden zum speichern und das Ganze auch auf meinem Localhost ausprobiert, am Ergebnis hat sich nichts geändert. Zu sagen wäre noch, dass der Balken beim gleichen Bild nicht willkürlich auftritt sondern ich jedes mal exakt das gleiche Ergebnis erhalte, unabhängig davon mit welcher Methode und wie oft ich es probiere. Hat jemand eine Idee?

    Viele Grüße!

  • #2
    Hallo,

    ist das Bild ein konstruiertes Beispiel, um das Problem zu verdeutlichen oder entspricht das einem tatsächlichen Fehlerfall?

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Zitat von Ackergaul Beitrag anzeigen
      ich versuche mittels PHP externe Bilder auf meinen Server zu laden.
      Mit Erlaubnis der Gegenseite(n) hoffentlich?

      Was auffällt ist, dass die Original-Ressource mit einer angegebenen Content-Length von 53.898 Bytes ausgeliefert wird, deine jedoch nur mit 38.385.

      Ausserdem befindet sich am Ende deiner Ressource eine lange Sequenz der Byte-Folge "51 40 05 14" - aber ich habe keine spontane Idee, was genau das zu bedeuten hat.

      Habe schon diverse Methoden zum speichern und das Ganze auch auf meinem Localhost ausprobiert, am Ergebnis hat sich nichts geändert. Zu sagen wäre noch, dass der Balken beim gleichen Bild nicht willkürlich auftritt sondern ich jedes mal exakt das gleiche Ergebnis erhalte, unabhängig davon mit welcher Methode und wie oft ich es probiere.
      Vielleicht gibt es ein Problem mit der HTTP-Kommunikation zwischen den beiden Gegenstellen.
      Wenn das Problem bei dir sowohl auf deinem Server als auch lokal auftritt - dann wird es wohl eher beim externen Server liegen.

      Passiert das denn nur mit Bildern von diesem einen Server, oder auch mit welchen von anderen?
      Gibt es eine bestimmte Ressourcengrösse, unter der das Problem nicht auftritt, und ab der schon? (Oder ggf. umgekehrt.) (Zugegeben, recht schwer zu testen, man müsste erst mal Bildressourcen in unterschiedlichen Dateigrössen finden, die einen Schluss zulassen.)

      Ich weiss nicht, ob PHP seinen eigenen HTTP-Traffic irgendwo loggt/loggen kann. Ein Auszug des Access-Logs der Gegenseite wäre sicherlich interessant. (Wenn man den beim konkret getesteten Server nicht in die Finger kriegen kann, wäre eine Nachstellung des Problems auf einem anderen "eigenen" Server hilfreich.)
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Zitat von wahsaga Beitrag anzeigen
        Ausserdem befindet sich am Ende deiner Ressource eine lange Sequenz der Byte-Folge "51 40 05 14" - aber ich habe keine spontane Idee, was genau das zu bedeuten hat.
        Dass der schwarze Balken kein Übertragungsfehler, sondern absichtlich gemacht ist.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von AmicaNoctis Beitrag anzeigen
          Dass der schwarze Balken kein Übertragungsfehler, sondern absichtlich gemacht ist.
          Was veranlasst dich zu der Annahme?

          Erscheint mir eher unwahrscheinlich - zumindest wenn er vor der JPEG-Komprimierung in die Bilddaten eingefügt worden wäre, dann würde das bedeuten, dass diese nicht viel taugt, wenn sie eine Bytesequenz derart oft wiederholt ...
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Zitat von wahsaga Beitrag anzeigen
            Was veranlasst dich zu der Annahme?

            Erscheint mir eher unwahrscheinlich - zumindest wenn er vor der JPEG-Komprimierung in die Bilddaten eingefügt worden wäre, dann würde das bedeuten, dass diese nicht viel taugt, wenn sie eine Bytesequenz derart oft wiederholt ...
            Meine zwei Vermutungen:

            a) der Fragesteller hatte grad kein Beispiel parat und hat eins konstruiert, um uns zu zeigen, was er meint.
            b) Der Bildanbieter verfälscht die Bilder mit PHP, wenn zu viele Anfragen vom selben Server kommen.

            Der Balken wurde definitiv vor der Komprimierung eingefügt. JFIF ist nicht gleich ZIP und sowohl der Farbraumtransformation, als auch der DCT als auch der Quantisierungsmatrix ist herzlich egal, ob da jetzt ein 8x8 Pixel Block schwarz ist oder hunderte. Und ob eine Komprimierung was taugt oder nicht, hängt vom konkreten Anwendungsfall ab. JFIF ist nun mal für Fotos konzipiert worden und GIF schneidet bei einem Foto dafür noch schlechter ab als JFIF bei Nicht-Fotos.

            Und wenn es ein Übetragungsfehler sein sollte, ist es extrem unwahrscheinlich, dass dabei aus dem ursprünglichen Kommentar ein anderer wird, der zudem noch als Produktname einer bekannten Grafikbibliothek lesbar ist.
            Zuletzt geändert von AmicaNoctis; 24.09.2009, 02:21.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Zitat von AmicaNoctis Beitrag anzeigen
              Und wenn es ein Übetragungsfehler sein sollte, ist es extrem unwahrscheinlich, dass dabei aus dem ursprünglichen Kommentar ein anderer wird, der zudem noch als Produktname einer bekannten Grafikbibliothek lesbar ist.
              Oha, stimmt - diese Diskrepanz war mir gar nicht aufgefallen.

              Dann scheint mir dein b) aber doch nicht so wahrscheinlich, denn darauf würde man als (mental gesunder) Betreiber der Original-Seite vermutlich anders reagieren (schon allein, um Traffic zu sparen - ein 403 wäre doch eine sehr viel billigere Ohrfeige, als ein "haha, ich hab schwarze Balken ins Bild gemacht, damit du viel Zeit damit verbringen kannst, nach dem vermeintlichen Fehler zu suchen").

              Damit scheint mir, wenn's nicht a) ist,
              c) der Fragesteller macht noch andere Sachen mit dem Bild (wissentlich oder nicht), nachdem er es "heruntergeladen" geladen hat, die uns bisher nicht bekannt sind
              noch die wahrscheinlichste Variante.


              OffTopic:
              Hach, macht spekulieren Spaß. Hoffentlich "versaut" es der Fragesteller nicht zu bald durch detailiertere Infos
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Zitat von wahsaga Beitrag anzeigen
                Damit scheint mir, wenn's nicht a) ist,
                c) der Fragesteller macht noch andere Sachen mit dem Bild (wissentlich oder nicht), nachdem er es "heruntergeladen" geladen hat, die uns bisher nicht bekannt sind
                noch die wahrscheinlichste Variante.


                OffTopic:
                Hach, macht spekulieren Spaß. Hoffentlich "versaut" es der Fragesteller nicht zu bald durch detailiertere Infos
                Die Idee hatte ich auch schon, aber daran stören mich drei Dinge:

                1.) Warum sollte er sowohl file_get_contents als auch file_put_contents im Code anführen, wenn keins von beidem für die Benutzung der GD-Funktionen Sinn macht (höchstens ersteres, wenn er das Bild aus nem String lädt)?

                2.) Sollte es ihm nicht eigentlich komisch vorkommen, wenn er ein imagefill benutzt, obwohl er gar nichts flooden will?

                3.) Warum sollte er zwei Mal hintereinander imagecopyresampled mit falschen Koordinaten benutzen? (Von einem Aufruf allein bekommt man so einen schwarzen Balken nicht hin.) [COLOR="Red"]Edit:[/COLOR] während meiner Rauchpause ist mir eingefallen, dass es doch mit nur einem Aufruf gehen müsste: wenn man für das Quellbild ne falsche Höhe angibt.

                Mir macht's auch Spaß
                Zuletzt geändert von AmicaNoctis; 24.09.2009, 03:06.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Zitat von AmicaNoctis Beitrag anzeigen
                  2.) Sollte es ihm nicht eigentlich komisch vorkommen, wenn er ein imagefill benutzt, obwohl er gar nichts flooden will?
                  imagefill - wo?


                  Warum sollte der Bildanbieter, so dieser wirklich selber das Bild verfälscht ausliefert, weil ihm die Details des Requests oder die Frequenz dieser nicht gefallen, im "Fehlerfalle" ein Bild ausliefern, das von den Maßen her geringfügig kleiner ist als das Original ...? (Original 425*600, Kopie 423*598)

                  Mir macht's auch Spaß
                  Ich komm mir auch gerade vor, als würd' ich bei Akte X und CSI gleichzeitig mitspielen
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Zitat von wahsaga Beitrag anzeigen
                    imagefill - wo?
                    Weiß ich nicht, in dem Quelltext, den er uns nicht verraten hat. Das ist nur ne Vermutung, wo der schwarze Balken herkommt.

                    Zitat von wahsaga Beitrag anzeigen
                    Warum sollte der Bildanbieter, so dieser wirklich selber das Bild verfälscht ausliefert, weil ihm die Details des Requests oder die Frequenz dieser nicht gefallen, im "Fehlerfalle" ein Bild ausliefern, das von den Maßen her geringfügig kleiner ist als das Original ...? (Original 425*600, Kopie 423*598)
                    Keine Ahnung, aber das ist das was für Punkt 3 spricht.

                    Zitat von wahsaga Beitrag anzeigen
                    Ich komm mir auch gerade vor, als würd' ich bei Akte X und CSI gleichzeitig mitspielen
                    Als Gil Mulder oder Fox Grissom?

                    Regards,

                    Sara Scully
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Vielen Dank für die Antworten.

                      Das Beispiel oben ist nicht konstruiert sondern es zeigt exakt das Bild wie ich es vom Script erhalte. In der Tat wird nach dem Upload das Bild noch verkleinert, das Bild weist direkt nach dem Download aber schon den schwarzen Balken auf, bevor es an meine Funktion cropImage übergeben wird.
                      Hier ist der komplette Code:

                      PHP-Code:
                      $connection_id ftp_connect($ftp_server);
                              
                      $login_result ftp_login($connection_id$ftp_user$ftp_pass);
                              
                              for(
                      $i=1;$i<=10;$i++) {
                              
                                  if ((isset(
                      $_POST['url_' $i])) AND (!isset($_POST['delete_' $i]))) {
                                  
                                      if (
                      $i == 1)
                                          
                      $_POST trimForm($_POST);
                                  
                                      
                      $part1 explode('/'$_POST['url_' $i]);
                                      
                      $anz count($part1);
                                      
                      $part2 explode('.'$part1[$anz-1]);
                                      
                                      
                      #var_dump($part);
                                      
                                      
                      $sql 'SELECT id FROM images ORDER BY id DESC LIMIT 1';
                                      
                      $res q($sql);
                                      
                      $row fetch($res);
                                      
                                      
                      $nextID $row['id']+1;
                                      
                                      
                      $filename strtolower($_POST['name_' $i]);
                                      
                      $filename str_replace(' ''_'$filename);
                                      
                      $filename $filename '-' $nextID '.' $part2[1];
                                      
                                      
                      $destination_file 'pics/' $filename[0] . '/' $filename;
                                      
                      $external_file $_POST['url_' $i];
                                      
                      $local_file $filename;
                                      
                      $data file_get_contents($external_file);
                                      
                      file_put_contents($local_file$data);
                                      
                      cropImage(''''$filename);
                                      
                      $upload ftp_put($connection_id$destination_file$local_fileFTP_BINARY);
                                      
                      unlink($local_file);
                                      
                                      
                      $sql 'INSERT INTO images (file_url_old, file_name, file_type, name, tags) 
                                              VALUES ("' 
                      $_POST['url_' $i] . '", "' $imageserver_url $filename[0] . '/' $filename '", "' $part2[1] . '", "' $_POST['name_' $i] . '", 
                                              "' 
                      $_POST['tags_' $i] . '")';
                                      
                      $res q($sql);                
                                  
                                  }                
                              }
                              
                              
                      ftp_quit($connection_id); 

                      Um direkt etwaigen Spekulationen vorzubeugen, hier 4 Versionen des Bildes wie es als $local_file abgespeichert wird:
                      http://www.pictureshunt.com/admin/hund-28.jpg
                      http://www.pictureshunt.com/admin/hund-31.jpg
                      http://www.pictureshunt.com/admin/hund-33.jpg
                      http://www.pictureshunt.com/admin/hund-35.jpg

                      Nach mehreren weiteren Versuchen kann ich noch sagen, dass das Problem, wenn es denn auftritt, nur Bilder im Hochformat betrifft. Wenn ein Bild betroffen ist, erhalte ich jedes mal exakt das gleiche Ergebnis. Es ist also nicht so, dass das Problem beim gleichen Bild mal auftritt und dann wieder nicht.

                      Viele Grüße!

                      EDIT: Argh, ich bin doof. Es scheint doch an meiner Funktion cropImage zu liegen, ich habe nicht bedacht, dass diese ja mein Bild $local_file überschreibt
                      Zuletzt geändert von Ackergaul; 24.09.2009, 12:48.

                      Kommentar

                      Lädt...
                      X