フォームから画像をアップロードする時の「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のみで画像がアップロードできなかったのはこれが原因だったのかもしれません。
これが原因でクライアントに「バグだ」と指摘されるのは、何ともやりきれない気持ちになりますね。