PHPでアップロードファイルのサイズチェックに関する処理で困っています。
アップロードファイルのサイズチェックを行う場合はPHPスクリプト内でスーパーグローバール変数の$_FILES[フォーム名]['size']からサイズチェックを行うのが一般的であると考えています。
ところが、php.iniのパラメーターpost_max_sizeを超えるサイズのファイルをアップロードしようとするとファイルのアップロードが行われないため$_FILES[フォーム名]['size']でのチェックも行えずユーザーにファイルサイズに起因するエラーであることを通知することが出来ません。
そこで、お知恵をお借りしたいのはpost_max_sizeを超えるサイズのファイルをアップロードした際(またはしようとした際)に、ユーザーにファイルサイズに起因するエラーであることを知らせる方法はあるのでしょうか?
方法の例として以下の2つを見つけたのですが、いずれもユーザーに的確にエラーを返すことが出来ません。
1.HTMLのFORMタグ内にMAX_FILE_SIZEを指定する。
→ 指定した値より大きなファイルをアップロードすると画面がリロードされたような動きとなりフォームがクリアされます。
PHPスクリプトに処理がわたらないようでユーザーにエラーを返せません。(IE8 / Apache2.2 + PHP5の場合)
2.ブラウザ側スクリプトでファイルサイズを取得する
→ IE限定の方法しかないためIE以外でも可能な方法を期待しています。
なにか良い方法をご存知の方はお力を貸してください。
No.3ベストアンサー
- 回答日時:
ANo.1です。
実際に確認してみました。確かにpost_max_sizeを超える場合はポストデータ自体が取得できませんでした。
適当なことを書いていたようです、申し訳ないです。
で、ちょっと調べてみたところ、$_POST、$_FILESは取得できなくても$_SERVERのCONTENT_LENGTHで判断するという方法があるようです。
http://q.hatena.ne.jp/1193396523
たびたびご回答ありがとうございます。
UmJammerさんのヒントを参考に期待する処理が出来ました!
1.get_cfg_var()でphp.iniに設定されているpost_max_sizeを取得
2.post_max_sizeの値はMBで返されるので、1024*1024をかける
3.$_SERVERのCONTENT_LENGTHが「2」の値を超えていると、post_max_sizeを超えていることになるので、それ相応のエラーを返す。
以上のような処理で、自分の希望する処理を実現できました!
1週間くらいはまってて本当に困っていました・・・
# 自分の調べ方もいろいろ不十分でした。すみません。
今回ちょっと気になったのはメジャーなオープンソース系アプリやCMSでもpost_max_sizeを超えた場合のエラー処理が考慮されていないと言う点です。
post_max_sizeをものすごく大きな値にすればよいのかもしれませんが、ある種のDOSを受け付けてしまうことになるので好ましくありませんね。
最後になりましたが今回は、本当にありがとうございました!
とても助かりました!!
No.2
- 回答日時:
ANo.1です。
upload_max_filesizeを設定することは試してみましたか?
尚、このディレクティブはpost_max_sizeより小さいく設定しないと意味がないかもしれません。
あとはコードが分からないのでなんとも。
ご回答ありがとうございます。
アップロードしたファイルのサイズがupload_max_filesizeよりも大きくて、post_max_sizeよりも小さい場合は意図したエラー処理を行えますが、upload_max_filesizeをいくつに設定してもpost_max_sizeを超えた場合のエラーは取れないようです。
post_max_sizeを超えたファイル(ほかのPOSTデータも含んだ合計サイズが超えた場合です)をアップロードした時点で、POST自体が無効になるようです。
なので、PHP側でエラー処理などが行えません。
あれからずっといろいろ調べていますが、良い方法が見つかりません・・・
OpenPNEのようなオープンソースアプリでもpost_max_sizeを超えたPOSTに対するエラー処理は考慮されていませんので、もしかしたらエラーなんて気にしないのがスタンダードなのでしょうか・・・
No.1
- 回答日時:
アップロード時のエラーは(サイズオーバーも含め)$_FILES['userfile']['error'] で調べられます。
これをもとに処理すればよいのでは。詳しくは以下を参照してみてください。
http://jp.php.net/manual/ja/features.file-upload …
コメントありがとうございます。
UPLOAD_ERR_PARTIALやUPLOAD_ERR_NO_FILEが返ることを期待してソースを変更してみたのですが、post_max_sizeを超えるサイズのファイルをアップロードした場合は、画面がリロードされたようになってスクリプトに処理がわたってきません。
たとえば、$_FILES['userfile']['error']をechoするようにしてもpost_max_sizeを超えるサイズの場合はそこまで処理がたどり着かないようです。(post_max_sizeを超えないサイズであればechoの処理で0が表示されます。)
やっぱりhttpdのレベルで処理しちゃうしかないのでしょうか・・・
もし、ほかに良い方法をご存知であればご教授いただければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラウドにアップロード」」...
-
Struts2 ファイルアップロード
-
onedrive にexcelファイルをア...
-
SmartyでHTMLソースの変更が反...
-
youtubeに音声のみのmp4ファイ...
-
uploadfile名をuploadfile$iに
-
phpでファイルをアップロードで...
-
DreamWeaverファイルのアップロ...
-
PHP 画像アップロード 重複防止
-
PHPのif文でその処理を途中で抜...
-
「@$変数」の「@の意味は?」
-
PHPで新しいウインドウで開く命...
-
FTPコマンドでディレクトリごと...
-
VBSの「MsgBox」について
-
トランザクションが原因?DBに...
-
レジストリにあるアプリケーシ...
-
is_fileでファイルが存在してい...
-
xamppでformによるデータの送信...
-
glob関数で日本語文字が取得で...
-
フォントの色を変えるには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
違法アップロードについて
-
「クラウドにアップロード」」...
-
youtubeに音声のみのmp4ファイ...
-
ファイルをGET送信でアップロー...
-
FTPClientで転送結果(OKかFAIL)
-
ftpでアップロードが出来ない
-
php,file_get_contentsの結果が...
-
DUMPした巨大SQLファイルをイン...
-
unlinkでどうしてもファイルが...
-
FTP接続の例外処理
-
PHPでxmlをAPIに送信する方法(P...
-
ファイルのアップロードがどう...
-
BASP21のFTPで日本語ファイル名...
-
one drive のアップロード失敗...
-
SmartyでHTMLソースの変更が反...
-
ファイルアップロードしたもの...
-
$filePath = './user_img/' . $...
-
画面遷移させずに、選択画像フ...
-
movabletypeでPDFファイルをア...
おすすめ情報