• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:preg_matchの使い方)

preg_matchの使い方

このQ&Aのポイント
  • preg_matchを使用して制限されたファイル形式のアップロードを実装する方法
  • アップロードされた画像ファイルを指定のフォルダに保存し、入力画面に表示するサンプルの解説
  • preg_matchの間違った使用方法によるエラーの原因特定と解決方法の説明

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>「preg_match」を使ってアップロードできるファイルを >gif,jpg,pngに限定するというようにしたいのですが チェックする手段が間違っています。$_FILES["data"]["name"]のような詐称可能なものをアテにしてはいけません。 $info = getimagesize($_FILES["data"]["tmp_name"]); として、 $info[2]が、IMAGETYPE_JPG, IMAGETYPE_GIF, IMAGETYPE_PNG のいずれかであることをチェックしてください。 exif系が使えるならexif_imagetypeでもいいですが、どうせwidth, heightもチェックするでしょうからね。

okdayook
質問者

お礼

PHP言語は非常に簡単というインターネットの噂を信じ 勉強を始めたのですが、あまりの複雑さに挫折の繰り返しです。 根気よく続けれるよう努力したいと思います。 今回は本当に助かりました。 ありがとうございました。

okdayook
質問者

補足

どうしてなのかまだ理解できていないのですが とりあえず「getimagesize」を使ったら上手く結果が出るようになりました。 本当にありがとうございました。 あと多くのファイルアップロード勉強参考サイトを見ると $_FILES["data"]["tmp_name"]の部分はタイプ数が長くなるにもかかわらず 変数に入れず、わざわざそのまま記入されていますが 何か特別な意味があって、わざと変数に入れないようにしているのでしょうか? 処理結果は同じになるので 不思議に思いました。 ------------------------------------------------- <?php $updir = "./gif/"; $tmpfilename = $_FILES["data"]["tmp_name"]; ←※※※ $filename = $_FILES["data"]["name"]; if(file_exists($tmpfilename)){ $filesize = filesize($tmpfilename); if($filesize <= 100000){ if(getimagesize($tmpfilename)){ move_uploaded_file($tmpfilename, $updir.$filename); echo "ファイル名".$filename."アップロード成功!"; echo "<br><br>"; echo "<img src='./gif/$filename'>"; }else{ echo "jpg,pngもしくはgifのファイルしかアップできません。"; } }else{ echo "$filesize バイト。ファイルサイズが大きすぎます。"; } } ?> </body> </html> -------------------------------------------------

その他の回答 (2)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>$_FILES["data"]["tmp_name"]の部分はタイプ数が長くなるにもかかわらず >変数に入れず、わざわざそのまま記入されていますが 適切な変数名を考えたりその変数名をtypoしていないかチェックしたりするくらいなら、$_FILESも'tmp_name'も固定(見た瞬間に打ち間違っていないことがわかる)の方が楽です。現行バージョンのphpなら未定義の変数は Undefined variables のNoticeになりますが、以前はそのまま動いていましたので変数名のtypoに気付かないで悩むことも多かったです。 まぁ一番の要因は、このくらいは「長い」とは思わないからでしょうね。私も長いと思ったことがないです(なのでわざわざ別の変数で使おうと思わない)。意味のない文字の羅列なら長いですが、そうではない(一字一句意味がある)ので。

okdayook
質問者

お礼

ご説明納得できました。ありがとうございました。

noname#244856
noname#244856
回答No.2

ファイルの識別で、ファイル名をアテにしている時点で誤りです。ファイルデータからMIMEタイプを調べなければなりません。 Qiita - ファイルアップロードの例外処理はこれぐらいしないと気が済まない http://qiita.com/mpyw/items/939964377766a54d4682 Qiita - 画像アップロード処理サンプル集http://qiita.com/mpyw/items/73ee77a9535cc65eff1e

okdayook
質問者

お礼

いつもありがとうございます! 学習レベルが届いておらず ご指摘のような構文を理解できるのは まだ遠い先だと思いますが ゆっくり頑張っていこうと思います。

関連するQ&A