Как предотвратить появление ошибки «Неправильный файл изображения» при использовании функции GD imagecreatefrom * в php? - PullRequest
2 голосов
/ 28 октября 2011

Я использую функции imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg с загруженными изображениями и иногда получаю сообщение об ошибке (например, предупреждение: imagecreatefromgif (): ... не является допустимым файлом GIF), когда изображение повреждено. Я прочитал много сообщений на эту тему и не смог найти «рабочий» ответ.

Я попробовал некоторые из следующих действий для проверки изображения (как предложено в других сообщениях), но ни один из них не работал во ВСЕХ ситуациях. Если изображение не имеет информации заголовка, работает следующее, но если изображение имеет информацию о типе заголовка / mime и повреждено, оно не работает.

if( imagecreatefromjpeg($uploaded_image) !== false ) {
    // image is okay.
}

OR

try {
    $test = imagecreatefrompng($uploaded_image);
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

OR

с использованием getimagesize ($ uploaded_image); // вернет false или ошибку, если изображение недопустимо.

Ни одна из этих ситуаций не работала с поврежденным файлом изображения, содержащим информацию заголовка / информацию о типе mime.

Я бы хотел предотвратить появление таких ошибок и, если возможно, определить, не повреждено ли изображение и может ли оно использоваться без проблем с любой из функций imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg. Если повреждено, я хотел бы показать сообщение об ошибке вместо запуска функции. Я ищу решение в PHP.

Спасибо за вашу помощь и предложения.

1 Ответ

8 голосов
/ 28 октября 2011

Вы можете попробовать

$gd = @imagecreatefromstring(file_get_contents($file_path));    
    if ($gd === false) {
        throw new Exception ('Image is corrupted');
    }

Он должен работать с большинством графических форматов, известных gd. Также, если вам нужно конкретное сообщение об ошибке, вы можете использовать error_get_last ().

@ будет подавлять сообщения об ошибках, а imagecreatefromstring пытается открыть известные форматы изображений. Если это не удастся, $ gd будет иметь значение «false», и сообщения об ошибках не выдаются.

Edit:

Обратите внимание, что в этом примере оператор @ также исключает любые ошибки из функции file_get_contents.

...