| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

23-09-2009, 22:38
|
|
Ackergaul
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 8
|
|
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!
|

24-09-2009, 00:36
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
ist das Bild ein konstruiertes Beispiel, um das Problem zu verdeutlichen oder entspricht das einem tatsächlichen Fehlerfall?
Gruß,
Amica
|

24-09-2009, 00:49
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Ackergaul
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.
Zitat:
|
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.
|

24-09-2009, 01:38
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von wahsaga
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.
|

24-09-2009, 02:01
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von AmicaNoctis
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.
|

24-09-2009, 02:19
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von wahsaga
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.
Geändert von AmicaNoctis (24-09-2009 um 02:21 Uhr)
|

24-09-2009, 02:50
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von AmicaNoctis
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.
|

24-09-2009, 02:58
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von wahsaga
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.) Edit: 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ß
Geändert von AmicaNoctis (24-09-2009 um 03:06 Uhr)
|

24-09-2009, 03:21
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von AmicaNoctis
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)
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.
|

24-09-2009, 03:28
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von wahsaga
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:
Zitat von wahsaga
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:
Zitat von wahsaga
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
|

24-09-2009, 12:42
|
|
Ackergaul
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 8
|
|
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_file, FTP_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
Geändert von Ackergaul (24-09-2009 um 12:48 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|