JPEG-Dateien, die in ein PHP-Skript hochgeladen wurden, sind beschädigt - aber nicht immer

8

Ich habe ein PHP-Skript, in das ich JPEG-Bilder hochlade (über ein HTML-Formular). Sie können den Code hier sehen, aber ich werde versuchen, die relevanten Teile in diesem Beitrag zu präsentieren. Das Formular wird wie folgt deklariert:

%Vor%

Das Formularfeld MAX_FILE_SIZE ist auf 5 MB eingestellt:

%Vor%

Die Bilder, die ich hochladen möchte, sind ungefähr 3 MB groß.

Sobald es hochgeladen ist, mache ich die Bilddatei zu einem GD jpeg:

%Vor%

Manchmal funktioniert der Upload gut und manchmal gibt imagecreatefromjpeg Warnungen aus, dass das JPEG beschädigt ist. Zum Beispiel (Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt):

%Vor%

Die Sache ist, das passiert nicht zuverlässig. Das heißt, wenn ich das gleiche Bild mehrmals hintereinander versuche, wird es manchmal erfolgreich hochgeladen, und manchmal wird es Fehler geben. Und innerhalb der Versuche, die zu Fehlern führen, werden die Besonderheiten der Fehlermeldung auch variieren. (Bei dem bestimmten Foto, das die obigen Nachrichten erzeugte, beträgt die Anzahl der "irrelevanten Bytes" manchmal 47, manchmal 20, gelegentlich 68.)

Was könnte dazu führen, dass die Dateien bei einigen Versuchen beschädigt werden, aber nicht bei anderen?

PS. Ich weiß, dass es eine Ini-Einstellung gibt, die GD anweist, mit korrupten JPEGs zu arbeiten. Aber das ist nicht der Punkt, ich möchte wissen, warum das Ergebnis des Uploads inkonsistent ist.

PPS. Hier sind die Werte einiger möglicherweise relevanter PHP ini Einstellungen:

%Vor%

UPDATE: Ich habe Code hinzugefügt, um die Größe und die MD5-Prüfsumme der Datei nach dem Hochladen wiederzugeben. Die Größe ist immer die richtige Dateigröße (die Größe meiner lokalen Kopie der Datei). Der MD5 variiert jedoch zwischen den Versuchen. Wenn das MD5 korrekt ist (entspricht dem MD5 meiner lokalen Kopie), gibt es keine Fehlermeldung. Wenn eine Fehlermeldung angezeigt wird, unterscheidet sich das MD5 immer von der erwarteten. Auch das ist nur ein wahrgenommener Unterschied, aber Fehler schienen letzte Nacht häufiger als heute Morgen aufgetreten zu sein - nur eine Minderheit von Übertragungen an diesem Morgen führte zu einem Fehler.

Hier sind einige "schlechte" Uploads (seltsamerweise gab es ein paar Uploads, die eine MD5-Prüfsumme anders als erwartet ergaben, aber keine Fehler erzeugte):

%Vor%

UPDATE: Als Antwort auf Andre und Pekka: Hier sind Links zu zwei Versionen des gleichen Bildes. Dieser ist die Originalkopie des Bildes, die auf meinem Computer gespeichert ist. Ich habe es so hochgeladen, wie ich normalerweise Dateien auf mein Webhosting hochlade, d. H. Ich habe einen FTP-Client benutzt. Dies ist das gleiche Bild, das mit meinem Skript hochgeladen wurde (aber mit einer hinzugefügten Zeile, um es mit% co_de an diesen Ort zu verschieben %). Die Fehlermeldung bei diesem Upload lautete "Beschädigte JPEG-Daten: 30 externe Bytes ...". Sie werden feststellen, dass der untere Teil des Bildes falsch erscheint. Ich entschuldige mich für die Größe der Bilder, aber ich kann nur Beispiele für die Art von Bildern verwenden, die mir Probleme bereiten.

  • Ich sollte klarstellen, dass dies ein anderes Bild ist als das, das ich für die obigen MD5-Prüfsummen verwendet habe. Ich dachte nicht, das gleiche Bild zu verwenden.

UPDATE: Mit den beiden oben verlinkten Bildern habe ich die Unterschiede zwischen den beiden Dateien gefunden. Es gibt zwei Sequenzen von 32 Bytes, die sich in einem Bild von dem anderen unterscheiden. Die Dateien sind ansonsten identisch.

%Vor%     
Hammerite 04.02.2011, 18:54
quelle

3 Antworten

3

Sind Sie sicher, dass es keine Probleme mit Ihrer Internetverbindung gibt? Haben Sie es von einer anderen Verbindung oder sogar ISP versucht?

    
SkaveRat 05.02.2011, 21:22
quelle
0

Es ist eine Strecke, aber ein mögliches Problem, das ich denken kann, ist, dass Sie an der temporären Datei arbeiten, versuchen Sie, move_uploaded_file zu verwenden, um die Datei an einen von Ihnen angegebenen Ort zu verschieben, und sehen Sie, ob das einen Unterschied macht? p>     

Mike P 04.02.2011 19:22
quelle
0

Anstatt zu diesem Zeitpunkt eine Konvertierung zu versuchen, sollten Sie die Informationen zur temporären Datei ablegen und die Dateigröße usw. vergleichen.

Wegen der zufälligen Natur ist dies wahrscheinlich eine Form von Übertragungsproblemen. Sie können wahrscheinlich Ihre eigene Hardware ausschließen, indem Sie versuchen, eine Zip-Datei mit anständiger Größe (z. B.) von dem Computer, den Sie ausführen, zu einem anderen im lokalen Netzwerk zu verschieben und dann zu überprüfen, ob die ZIP-Datei die CRC-Prüfung besteht wird beschädigt.

Außerdem: Führen Sie eine Firewall-Appliance aus, die HTTP-Verkehr abfragt? (z. B. entwirren)

    
horatio 04.02.2011 20:04
quelle

Tags und Links