Тест PHP для поврежденных (но, видимо, хороших) изображений - PullRequest
0 голосов
/ 03 октября 2011

У меня есть простой скрипт загрузки изображений, который использует SimpleImage.php (http://www.white -hat-web-design.co.uk / блог / изменение размеров-изображения-с-PHP /) изменить размер и сохранить 2 копии загруженного изображения.

Нет большого количества проверок, просто проверяется, что он существует и что расширение файла в порядке, а также exif_imagetype(); вызов.

До сих пор это работало без проблем, пока я не попытался загрузить, казалось бы, обычный jpeg, который оказался невидимым (и непроверенным?) Поврежденным. В этом было что-то не так, но я очень мало знаю о повреждении изображения - оно выглядело нормально и ни с чем не сталкивалось, но когда я попытался сохранить масштабированную копию в своем скрипте, я получил белую страницу.

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

Я изменил размер копии с помощью Photoshop (прогнозируемый размер файла дал мне несколько странных чисел - 45 мг для jpeg высшего качества), и он был загружен без проблем.

Итак, мой вопрос, как мне проверить это?

Это изображение здесь: http://chinawin.co.uk/broken.jpg // будьте осторожны, 700k

примечания: я тестировал с аналогичными разрешениями, размерами и именами изображений, все остальное работало отдельно от этого изображения

UPDATE: Методом проб и ошибок я сузил место, где скрипт разрывается до строки, в которой я загружаю изображение в переменную для SimpleImage. Странно, что это вторая строка, которая делает это (первая для создания большой копии, эта для создания эскиза). Комментирование означает, что все остальное работает нормально ... возможно, некоторый рефакторинг поможет избежать этой проблемы.

2-е обновление: Вот фрагмент кода и некоторый контекст из строки, которая терпит неудачу:

//check if our image is OK
if ($image && $imageThumb) 
{
    //check if image is a jpeg
    if (exif_imagetype($_FILES[$k]['tmp_name']) == IMAGETYPE_JPEG)
    {
        list($width, $height, $type, $attr) = getimagesize($_FILES[$k]['tmp_name']);
        //echo 1;
        $image = new SimpleImage(); 
        //echo 2;               
        $image->load($_FILES[$k]['tmp_name']);      
        //echo 3;
        $imageThumb = new SimpleImage();
        //echo 4;

        //this next line topples my script, but only for that one image - why?:
        $imageThumb->load($_FILES[$k]['tmp_name']);
        //echo '5<br/><br/>-------<br/>';
        //do stuff, save & update db, etc
    }
}

Окончательное редактирование: Оказывается, в моем сценарии не хватает памяти, и на то есть веская причина - изображение размером 4900x3900 с разрешением 240 точек на дюйм при загрузке в память оказывается дважды 48 мегабайт, поэтому я использовал, вероятно,> 90 мг оперативной памяти, на изображение.

Снимаю шляпу перед @Pekka за то, что заметил это.

Рефакторинг скрипта так, чтобы изображение загружалось только один раз, а затем эта переменная, используемая вместо брата, исправила мой скрипт. По-прежнему возникают (другие) проблемы с загрузкой больших (2,5 мегабайтов) изображений, но это уже другой вопрос.

1 Ответ

2 голосов
/ 03 октября 2011

Скорее всего, это проблема памяти: ваш JPG очень большой (более 4000 x 4000 пикселей) и без сжатия действительно съедает около 48 мегабайт оперативной памяти.

Активируйте отчеты об ошибках, чтобы убедиться. Если это причина, см., Например, вот что нужно сделать: Загрузка изображений с помощью PHP и превышение лимита памяти скрипта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...