2

アップロードされた画像で imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg 関数を使用していますが、画像が破損している場合にエラー (例: 警告: imagecreatefromgif(): ... は有効な GIF ファイルではありません) が発生することがあります。このトピックに関する多くの投稿を読みましたが、「有効な」答えが見つかりませんでした。

画像を検証するために次のいくつかを試しました(他の投稿で提案されているように)が、すべての状況で機能するものはありませんでした. 画像にヘッダー情報が含まれていない場合、次の方法は機能しますが、画像にヘッダー/MIME タイプ情報が含まれていて破損している場合は機能しません。

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

また

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

また

getimagesize($uploaded_image) の使用; // 画像が有効でない場合は false またはエラーを返します。

これらの状況のいずれも、ヘッダー情報/MIME タイプ情報を持つ破損した画像ファイルでは機能しませんでした。

これらのエラーが発生するのを防ぎ、可能であれば、画像が破損しておらず、imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg 関数のいずれでも問題なく使用できるかどうかを検出したいと考えています。破損している場合は、関数を実行する代わりにエラー メッセージを表示したいと考えています。PHPで解決策を探しています。

あなたの助けと提案に感謝します。

4

1 に答える 1

8

あなたが試すことができます

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

gdで知られているほとんどの画像形式で動作するはずです。また、特定のエラーメッセージが必要な場合は、error_get_last()を使用できます。

@はエラーメッセージを抑制し、imagecreatefromstringは既知の画像形式を開こうとします。これが失敗した場合、$gdの値は'false'になり、エラーメッセージはスローされません。

編集:

この例では、@演算子もfile_get_contents関数からのエラーをサポートすることに注意してください。

于 2011-10-28T18:31:58.583 に答える