
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルサイズがpost_max_size...
-
youtubeに音声のみのmp4ファイ...
-
FTPClientで転送結果(OKかFAIL)
-
SmartyでHTMLソースの変更が反...
-
ファイルのアップロード$_FILES...
-
ファイルのアップロードがどう...
-
VBでクラウドストレージにア...
-
ファイルをGET送信でアップロー...
-
*.php、*.php3、*.phtmlの違い
-
データベースへの持続的接続
-
さくらサーバーにて、phpからメ...
-
FTPコマンドでディレクトリごと...
-
メールフォームからのメールが...
-
シェルスクリプトをPHPで動かそ...
-
PHPで、エラーがない場合のみ画...
-
バッチを用いたフォルダの自動移動
-
Switch文における、returnとbre...
-
hexdec(uniqid())でE+15が付く
-
PHPでpaypal支払後のセッション...
-
GDI+を使ったビット数とDPIの扱い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラウドにアップロード」」...
-
onedrive にexcelファイルをア...
-
SmartyでHTMLソースの変更が反...
-
VBでクラウドストレージにア...
-
youtubeに音声のみのmp4ファイ...
-
FTPClientで転送結果(OKかFAIL)
-
ftpでアップロードが出来ない
-
ファイルサイズがpost_max_size...
-
unlinkでどうしてもファイルが...
-
ファイルをGET送信でアップロー...
-
ファイルアップロードの日付に...
-
PHPでxmlをAPIに送信する方法(P...
-
画像ファイルの名前をそのままU...
-
FTP接続の例外処理
-
アップロードのボタンが有りま...
-
ファイルのアップロード$_FILES...
-
ファイルのアップロードでパス...
-
ファイルアップロードの上限を...
-
FTPソフトでの複数フォルダへの...
-
prototype.jsのAjax.Request
おすすめ情報