こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルサイズがpost_max_sizeを超える場合のエラー処理について

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以外でも可能な方法を期待しています。

なにか良い方法をご存知の方はお力を貸してください。

投稿日時 - 2009-07-28 22:52:01

QNo.5163609

困ってます

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

ANo.1です。

実際に確認してみました。確かにpost_max_sizeを超える場合はポストデータ自体が取得できませんでした。
適当なことを書いていたようです、申し訳ないです。

で、ちょっと調べてみたところ、$_POST、$_FILESは取得できなくても$_SERVERのCONTENT_LENGTHで判断するという方法があるようです。
http://q.hatena.ne.jp/1193396523

投稿日時 - 2009-08-02 22:32:28

お礼

たびたびご回答ありがとうございます。
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を受け付けてしまうことになるので好ましくありませんね。

最後になりましたが今回は、本当にありがとうございました!
とても助かりました!!

投稿日時 - 2009-08-02 23:16:45

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ANo.1です。

upload_max_filesizeを設定することは試してみましたか?
尚、このディレクティブはpost_max_sizeより小さいく設定しないと意味がないかもしれません。
あとはコードが分からないのでなんとも。

投稿日時 - 2009-07-31 02:04:42

お礼

ご回答ありがとうございます。
アップロードしたファイルのサイズがupload_max_filesizeよりも大きくて、post_max_sizeよりも小さい場合は意図したエラー処理を行えますが、upload_max_filesizeをいくつに設定してもpost_max_sizeを超えた場合のエラーは取れないようです。

post_max_sizeを超えたファイル(ほかのPOSTデータも含んだ合計サイズが超えた場合です)をアップロードした時点で、POST自体が無効になるようです。
なので、PHP側でエラー処理などが行えません。

あれからずっといろいろ調べていますが、良い方法が見つかりません・・・
OpenPNEのようなオープンソースアプリでもpost_max_sizeを超えたPOSTに対するエラー処理は考慮されていませんので、もしかしたらエラーなんて気にしないのがスタンダードなのでしょうか・・・

投稿日時 - 2009-08-02 17:50:03

ANo.1

アップロード時のエラーは(サイズオーバーも含め)$_FILES['userfile']['error'] で調べられます。これをもとに処理すればよいのでは。
詳しくは以下を参照してみてください。
http://jp.php.net/manual/ja/features.file-upload.errors.php

投稿日時 - 2009-07-29 15:47:07

お礼

コメントありがとうございます。
UPLOAD_ERR_PARTIALやUPLOAD_ERR_NO_FILEが返ることを期待してソースを変更してみたのですが、post_max_sizeを超えるサイズのファイルをアップロードした場合は、画面がリロードされたようになってスクリプトに処理がわたってきません。
たとえば、$_FILES['userfile']['error']をechoするようにしてもpost_max_sizeを超えるサイズの場合はそこまで処理がたどり着かないようです。(post_max_sizeを超えないサイズであればechoの処理で0が表示されます。)

やっぱりhttpdのレベルで処理しちゃうしかないのでしょうか・・・

もし、ほかに良い方法をご存知であればご教授いただければ幸いです。

投稿日時 - 2009-07-29 22:05:26

あなたにオススメの質問