WEB/システム/IT技術ブログ

フォームから画像をアップロードする時の「image/pjpeg」という形式について

FirefoxやGoogle Chromeでは問題ないのに、Internet Explorerからだと画像をアップロードできないという問題が発生しました。
結果から言うと、原因はMicrosoftの独自仕様である「image/pjpeg」でした。

例えば、フォームで画像をアップロードする際、JPG画像に限定させたいという場合があります。
アップロードされたファイル名の拡張子から判断するのは危険なので、通常ではContent-Typeからファイルタイプを読み取ります。

以下はフォームのソース例です。

<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
</form>

フォームからのリクエストをPHPで受け取り、JPGかどうか判定するのに以下のように処理を実装します。

if(strcmp($_POST['image']['type'], 'image/jpeg') == 0){
	// このファイルはJPGです
}else{
	// このファイルはJPGではありません
}

JPGファイルのContent-Typeは「image/jpeg」なので、本来であれば処理はこれで問題ないように思われます。
しかしIEで画像をアップロードした場合、ブラウザ側が勝手にprogressive JPEGというものに変換して送られるそうです。そのため、Content-Typeは「image/pjpeg」になります。
つまりIEに対応させるためには、以下のように書かなければならないということです。

if(strcmp($_POST['image']['type'], 'image/jpeg') == 0 || strcmp($_POST['image']['type'], 'image/pjpeg') == 0){
	// このファイルはJPGです
}else{
	// このファイルはJPGではありません
}

ちなみに、私の環境で確認したところ、IE6、IE7、IE8でこの現象が確認できました。

過去にとあるコミュニティサイトで、IEのみで画像がアップロードできなかったのはこれが原因だったのかもしれません。
これが原因でクライアントに「バグだ」と指摘されるのは、何ともやりきれない気持ちになりますね。

B!

Comment

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives