PHPでファイルの先頭8バイトだけで画像の形式を調べる

このQ&Aのポイント
  • PHPのコードを使用して、ファイルの先頭8バイトだけで画像の形式を調べる方法についてご教授ください。
  • 実際に試したところ、正常に画像形式を判定することができなかったため、修正点や改善策を教えていただきたいです。
  • また、参考にしたページのリンクも教えていただけると嬉しいです。
回答を見る
  • ベストアンサー

phpでファイルの先頭8バイトだけで画像の形式を調べる

phpでファイルの先頭8バイトだけで画像の形式を調べる phpで画像の形式を調べる方法について http://labs.gmo.jp/blog/ku/2007/05/8.html のページを参考に、php5にて以下のようなコードを書いてみました。 //アップロードされたファイルを読み込み $fp = fopen($_FILES["upfile"]["tmp_name"],"rb"); $imgdata = fread($fp,filesize($imgfname)); fclose($fp); //画像形式判定 echo getImageType($imgdata)."形式と思われます\n"; function getImageType($dat){ if ( preg_match( '/^x89PNGx0dx0ax1ax0a/', $dat) ) { $type = "png"; } elseif ( preg_match( '/^GIF8[79]a/', $dat) ) { $type = "gif"; } elseif ( preg_match( '/^xffxd8/', $dat) ) { $type = "jpg"; } return $type; } ところが、png/gif/jpegいずれの画像でテストしてもgetImageTypeの結果が""となってしまい、正常に判定することができません。 修正点などご教授いただければ幸いです。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>filesize($imgfname) これはちゃんと取得出来ていますか? まずファイルがちゃんと取得出来ているのかをechoするなりして確認してみてください。 preg_matchでの正規表現ですが、 例えば、 >x89 ではなくて、「\x89」です。つまり円マーク(またはバックスラッシュ)が抜けています。 PNGの例ですと、 if ( preg_match( '/^\x89PNG\x0d\x0a\x1a\x0a/', $dat) ) { このように記述してください。

misshiki
質問者

お礼

ご回答ありがとうございました。 ご指摘のとおり、バックスラッシュが抜けていたのが原因でした。 修正したところ、正常に画像形式を判別することができました。

その他の回答 (2)

回答No.3

#質問者にあまり関係のない私信 > #2 俺は独自ビルドのPHP6を使っている。 で、次のコードを実行すると、 <?php $s = "\xFF"; echo rawurlencode((binary)$s); ?> これは%FFを出力せず、%C3%BFを出力する。chr関数も同じ挙動だ。(U+00FFをUTF-8で表現したもの) 面倒なので検証していないんだが、これはPHP5も同じかな?違うかな? #シングルクオート・正規表現の時でもそれで大丈夫? #個人的には型にうるさいつもりで、多言語で言うstringとbyte[]とかbyteは違うものだから使い分けたいって意識がある。 #Forward Compatibility的にも今から合わせておきたいなーとか思う

  • bx2
  • ベストアンサー率47% (97/206)
回答No.1

画像形式を調べるなら exif_imagetype() か getimagesize() で対応できます。 getimagesize() の場合、戻り値の2番目の要素に画像形式が格納されます。 http://jp2.php.net/manual/ja/function.exif-imagetype.php http://jp2.php.net/manual/ja/function.getimagesize.php

関連するQ&A

  • PHP 画像添付フォームに関しての質問です。

    PHP 画像添付フォームに関しての質問です。 http://okwave.jp/qa/q4891926.html 以前質問させて頂いた内容でフォームを作成しています。 申込html→finish.php の場合はうまくいきます。 申込html→確認→finish.php にするとうまくいきません。 可能であれば、確認画面でアップした画像を表示できればと思っております。 何かアドバイスして頂けると助かります。 申込html <form method="post" action="kakunin.php" enctype="multipart/form-data"> <input type="hidden" name="max_file_size" value="1000000"> <input type="hidden" name="upfile" value="%%upfile%%"> <input name="upfile" id="upfile" type="file" size="50" value="%%upfile%%"> 確認html <form method="post" action="finish.php"> <td class="border5px-fff">%%upfile%%<input type="hidden" name="upfile" value=""></td> finish.php $updir = "./photo/"; $filename = $_FILES['upfile']['name']; //form の「upfile」の値 //ファイルを指定 $id_file = "id.dat"; //ファイルを開く $fp = fopen($id_file,"r"); $id = fgets($fp); fclose($fp); //ファイルの数字に1を足します。 $id = $id + 1; $fp = fopen($id_file,"w"); //保存します。 fputs($fp, $id); fclose($fp); //名前の前に番号を追記します。 //$filename = 'ID_'.$id.'_'.$filename; //番号のみ $filename = $id.'.jpg'; move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename);

    • ベストアンサー
    • PHP
  • PHP 正規表現 スラッシュの扱いについて

    PHPでファイルをアップロードするプログラムを作っています。 誤ってCGIなどのプログラムをアップしない為に、 拡張子を判断してそれを防ぐ為の構造を考えています。 そこで条件部を、 if(!preg_match("/^image\/.*(png|jpeg|gif)$/i", $_FILES["file"]["type"]) || !preg_match("/^text/html\/.*(txt|html)$/i", $_FILES["file"]["type"])){ エラーメッセージ } としたのですが、上手く動いてくれません。 恐らく「text/html」の表記に問題があるのだと思うのですが… 解決方法、教えてください。よろしくお願いします。

    • 締切済み
    • PHP
  • 画像の置換え

    プログラム初心者です 番号と画像拡張子を簡単な正規表現で表す方法をおしえてください 拡張子はgif、png、jpgの拡張子です 番号は桁数も番号も変わります。この三パターンにマッチするテキストを置き換えたいです 例 56.gif 100.gif 6.png 6549.png 79169.jpg 35.jpg $pattern="/(\d+)/"; $replacement="<a href=\"$0\">$0</a>"; if(preg_match($pattern,$mes,$matches) ){ $mes=preg_replace($pattern,$replacement,$mes); } よろしくお願いします

    • ベストアンサー
    • PHP
  • 画像の保存形式について

    指定した画像等を切り取ってブログに貼りたいと思い、 キャプチャーソフトをダウンロードしました。 よく、画像(写真ではなく)を見ると、「BMP」や「GIF」が多いですが・・・ 私がダウンロードしたソフトは「GIF」形式にはできません。 しかも、ブログは『FC2』で、「BMP」はできません。 ダウンロードしたソフトに「PNG」があるのですが、 この形式ってあまり見た事ないけど、大丈夫でしょうか? 切り取りや、バナーってほとんどが、「BMP」や「GIF」で、「PNG」は使われてないですよね? 切り取りたい画像はサイトの一部です(例ビンゴとか) 「PNG」を使用しても問題はないでしょうか? 宜しくお願い致します。

  • 画像の形式

    もしかしたらこのカテゴリで質問するべきじゃないのかもしれないんですけど、どこで質問したらいいかわからなかったのでここでさせて下さい。 画像の形式って、gif、jpg、png、bmp、とありますよね? イラストをHPに載せたいのですが、gif対応ソフトを持っていないのでjpgかpngで載せたいのですが、イラストってjpgだと汚くなっちゃいますよね。 なのでpngを使いたいのですが、この形式ってまだ対応していないブラウザ(OS?)多いのでしょうか。 jpgで乗せた方がいいですか? それといまいち不安なんですがbmpってHPで使っていいんですか?(使えるか、ってことです。対応していないブラウザ/OSが多い、とか。) また、どのブラウザ(OS)で対応していないのか教えていただけると嬉しいです。(pngの方) うう、質問がわかりにくくてすいません。 よろしくおねがいします。

    • ベストアンサー
    • HTML
  • 画像のファイル形式の違いについて

     画像のファイル形式って、たくさんあって、違いがよくわかりません。JPEG,TIFF,BMP,PICT,GIF,PNGって具合にほんとたくさんあって、困ってます。  それぞれがどのように違うのを教えてください。たぶん、圧縮の仕方が違うだと思うのですが。本とか、ホームページとかも教えてくれたら嬉しいです。

  • RIF画像ファイルを他の形式に変換

    こんばんわ。 いきなりですが、RIF形式の画像ファイルを他の形式に変換できる無料のフリーソフトを教えて欲しいです。 (gif .jpg .png など) よろしくお願いします。

  • ビットマップの画像形式を変えたいのですが・・・

    画像をアップロードする際、ビットマップの画像をアップしたいのですが、「アップロード可能な画像形式はgif,jpg,pngのみです」とエラーになりました。 ビットマップ形式のファイルを、上記のアップ可能な形式に変換することは出来るのでしょうか?

  • ファイル形式変更について・・・

    私はパソコン初心者でくだらない質問なのかもしれませんが、自分で試してもわからず皆様に助言、回答願いたいです!! 最近はじめました、ブロブで画像をアップロードしたいと思っています。 そこでまず、画像ファイル入力画面で参考ボタンを押し、画像を選択しました。 すると≪.jpg、.png、.gif以外の拡張子の画像はアップロードできません ≫ と出てくるのです。 どの画像で試したても同じ表示が現れます。 ※ ファイル形式は .GIF .JPG .PNG でお願いします。 と書かれていることから、ファイル形式を変えなければならないと思うのですが、 全然見当がつきません。。。 どなたか、ご助言願います!!

  • PHPの画像処理

    PHP学習者です。 画像ディレクトリー内の画像をサイズを変えて表示するプログラムを作りましたが、JPG形式は表示されてもPNG形式やGIFが表示されません。 関係すると思われるコードの一部を掲載します。コードがおかしいのか、あるいは何かPNGのためにはしておくことがあるのか、詳しい方どうか教えてください。お願いします。 //*************************************************** public function getImage() // create thumbnail image to be sent to browser //*************************************************** { header("content-type:$this->mimetype"); switch($this->imageproperties[2]){ case IMAGETYPE_JPEG: imagejpeg($this->image,"",$this->quality); break; case IMAGETYPE_GIF: imagegif($this->image,""); break; case IMAGETYPE_PNG: imagepng($this->image,"", $this->quality); break; default: die("could not create image"); } // end case ; }

    • ベストアンサー
    • PHP

専門家に質問してみよう