У меня есть простой скрипт загрузки изображений, который использует 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 мегабайтов) изображений, но это уже другой вопрос.