getimagesize() возвращает false для некоторых изображений

Я запускаю getimagesize(), чтобы определить, является ли загруженный файл допустимым изображением, а также его типом MIME. Пользователь моего веб-приложения сообщил, что некоторые из его изображений получили ошибку «недопустимый тип файла» после их загрузки. Поэтому я попросил его прислать мне некоторые из них для проверки.

Сама строка ошибки не имеет смысла, так как это просто общий текст, написанный мной, когда функции терпят неудачу (возвращает FALSE). Я безуспешно пытался увеличить лимит памяти PHP. Кроме того, журналы не показывают ничего необычного. Проблема с файлами или что-то другое? есть ли лучший способ сделать эту операцию?

Я принимаю любой файл, который принимает getimagesize() (это означает, что он имеет ширину/высоту), я просто проверяю, не возвращает ли он FALSE (хотя моя реальная область видимости будет jpg|jpeg|png|gif|bmp|tif| тифф). На сервере работает PHP/5.2.6-1+lenny3. Повторяю, это происходит только со связанным изображением и некоторыми другими из той же серии, поэтому я более склонен думать, что это связано с тем, на что намекает Ящерица.

$_FILES кажется пустым, прежде чем перейти к getimagesize($_FILES['Filedata']['tmp_name']), поэтому файл никогда не проверяется. Мне нужно выяснить, почему эти файлы не отправляются, как остальные (возможно, слишком велики для PHP? Есть идеи?).


person lima    schedule 09.11.2009    source источник
comment
И какой код вы используете для проверки/проверки изображений?   -  person David says reinstate Monica    schedule 10.11.2009
comment
Ваш образ работает для меня с PHP 5.2.10-2ubuntu6.1: Content-type: image/jpeg; size: 2736x3648   -  person    schedule 10.11.2009


Ответы (5)


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

$file = "http://img27.imageshack.us/img27/9159/dsc00799e.jpg";
$info = getimagesize($file);

echo "<pre>" . print_r($info,true) . "</pre>";

(где $file равно расположению изображения, указанному в вопросе), выводит:

Array
(
    [0] => 2736
    [1] => 3648
    [2] => 2
    [3] => width="2736" height="3648"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

Это кажется нормальным. Я предполагаю ошибку где-то еще в ваших чеках?

person David says reinstate Monica    schedule 09.11.2009
comment
Да, тот же результат здесь с PHP 5.2.3 - person pablasso; 10.11.2009
comment
Я тоже получаю те же результаты, поэтому я обновляю вопрос, спасибо, рисовая чаша и паблассо! - person lima; 10.11.2009

Посмотрев вокруг, я нашел этот проницательный ответ относительно Ограничения загрузки PHP. Я объединил это с тем, что уже знал, и, наконец, заработал, используя следующий код в моем .htaccess (ограничивая загрузку до 5 МБ):

php_value upload_max_filesize 5M
php_value post_max_size 8M
php_value max_input_time 1800
LimitRequestBody 0

Итог: проблема была не в функции getimagesize() PHP, а в том, что изображения никогда не загружались на сервер из-за ограничений размера файла как в Apache, так и в PHP. Спасибо всем, кто ответил и прокомментировал, без вашей помощи было бы намного больнее разобраться!

person lima    schedule 10.11.2009
comment
Если массив $_FILES пуст, есть вероятность, что $_POST тоже пуст, поэтому параметр, который *#&% сообщает вам, равен post_max_size. Поскольку загрузка отправляется с запросом POST, он также находится в области действия этого параметра, поэтому PHP очищает $_POST, а поскольку $_POST пуст, PHP не находит ничего, что можно было бы поместить внутрь $_FILES. - person Pherrymason; 06.02.2013

Я не уверен, что это тот ответ, который вы ищете, но я знаю, что у меня есть проблемы с функциями php и изображениями размером более 3000 пикселей в любом измерении.

Надеюсь, это поможет!

person Lizard    schedule 09.11.2009

Вы сказали

$_FILES кажется пустым

Вы проверили на наличие ошибки загрузки? - Когда загрузка не удалась, PHP устанавливает элемент error массива файлов. См. раздел File Upload в документации по PHP, чтобы узнать о других ошибках. коды возможны.

person johannes    schedule 10.11.2009
comment
Спасибо за ваш ответ, Йоханнес, однако файл даже не попал в скрипт, поскольку PHP не мог его обработать из-за наложенных ограничений на загрузку. Как я уже сказал в своем ответе, изменение этих ограничений заставило его работать нормально. - person lima; 11.11.2009

Я столкнулся с той же проблемой, я использовал точно такую ​​же ссылку на файл, как и в теге img:

  $filename = "/images/logo.jpg"; 

  $size = getimagesize($filename); // <== this fails

  <img src="<?echo $filename ?>" />  // <== this works

Когда я удалил первую косую черту в имени файла и попробовал снова, это сработало:

  $size = getimagesize("/images/logo.jpg"); // <== this fails

  $size = getimagesize("images/logo.jpg"); // <== this works!

Я надеюсь, что это работает и для других.

person eheydenr    schedule 19.07.2015
comment
Это вы путаетесь между веб-путями и путями к диску - person JamesHalsall; 15.09.2015