PHP File Upload поврежден JPEGS - PullRequest
3 голосов
/ 11 июля 2011

У нас есть веб-приложение, использующее загрузчик ajax-файлов Andrew Valums, если мы начнем 5–10 загрузок изображений одновременно, чаще всего не менее 2 или 3 приводят к той же самой ошибке gd «Поврежденные данные JPEG»

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]:
         gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data:
         47 extraneous bytes before marker 0xd9 in .... 

Однако этого не произошло на нашем старом тестовом сервере или локальных блоках разработки, только на нашем новом рабочем сервере.

Размер файла на сервере такой же, как и на моем локальном компьютере, поэтому загрузка завершена, но я думаю, что данные повреждены сервером.

Я могу «исправить» испорченные файлы, удалив их и загрузив заново, или загрузив вручную через FTP

У нас был общий хост на Godaddy, и мы только начали создавать эту проблему в новом окне (которое я настроил, поэтому, вероятно, многое объясняет :) CentOS 5.5+, Apache 2.2.3, PHP 5.2.10

Вы можете увидеть пример хорошего и плохого изображения здесь. http://174.127.115.220/temp/pics.zip

Когда я их BinDiffed, я вижу непротиворечивую картину, искажение всегда составляет 64 байтовых блоков, и, хотя расстояние между поврежденными блоками не является постоянным, число 4356 очень много.

Я действительно думаю, что мы можем исключить Интернет, так как проверка ошибок и повторная передача по TCP довольно надежны, кроме того, похоже, что нет никакой разницы между версиями браузера или если я отключу антивирус и брандмауэры.

Итак, я выбираю конфигурацию Apache / PHP?

Ответы [ 5 ]

2 голосов
/ 25 сентября 2012

Некоторые камеры добавляют в файл некоторые данные, которые интерпретируются неправильно (скорее всего, это относится к кодированию символов в заголовках).

Решение, которое я нашел, состояло в том, чтобы прочитать файл в двоичном режиме следующим образом:

$fh = fopen('test.jpg', 'rb');
$str = '';
while($fh !== false && !feof($fh)){
    $str .= fread($fh, 1024);
}

$test = @imagecreatefromstring($str);

imagepng($test,'save.png');
1 голос
/ 11 июля 2011

Ну, я думаю, что проблема в данных jpeg-header, и, насколько я знаю, PHP не имеет к этому никакого отношения, я думаю, что проблема в вашем загрузчике файлов, может быть, есть какая-то конфигурация для этого, которую вы пропустили.

0 голосов
/ 31 января 2014

У меня была эта проблема с хостингом GoDaddy. Я создал базу данных на GoDaddy, используя их интерфейс cPanel. Он был создан как «латинская сортировка» (или что-то в этом роде). База данных на сервере разработки была UTF8. Я пробовал все решения на этой странице, но безрезультатно. Затем я преобразовал базу данных в UTF8, и она заработала.

Кодировка базы данных не должна влиять на данные BLOB (или я так думаю). BLOB расшифровывается как BINARY Large Object (что-то ...), насколько мне известно!

Кроме того, как ни странно, данные были скопированы с dev на рабочий сервер, пока база данных была еще "латинской", и она вообще не была повреждена. Проблема возникла только при вставке новых изображений. Поэтому я предполагаю, что данные изображений подавались в MySQL как текстовые данные, и я думаю, что есть способ (при использовании SQL) вставлять двоичные данные, и я не следовал им.

Редактировать: только что взглянул на скрипт экспорта MySQL, вот он:
INSERT INTO ... VALUES (..., _binary 0xFFD8FF ...

В любом случае, надеюсь, это кому-нибудь поможет. ОП не указал, что решило его проблему ...

0 голосов
/ 13 октября 2013

Это можно решить с помощью:

ini_set ('gd.jpeg_ignore_warning', 1);
0 голосов
/ 27 июля 2011

Хм - повреждение 64 байта? ... или вы имели в виду 64 бита?

Я собираюсь предположить, что проблема на самом деле является результатом сценария PHP.проблема, которая регулярно возникает здесь, состоит в том, что скрипт вставляет CRLF в загружаемый поток данных и вызван различиями между стандартами Window / * nix.

Решение состоит в том, чтобы заставить скрипт php загружать в двоичном видережим (используйте переключатель + b для ВСЕХ команд fopen () в загрузке php).Безопасно загружать текстовый файл в двоичном режиме, так как по крайней мере вы все еще можете видеть данные.

Прочтите здесь для получения дополнительной информации по этому вопросу:

http://us2.php.net/manual/en/function.fopen.php

...