アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

A 回答 (3件)

ANo.1です。



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

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

たびたびご回答ありがとうございます。
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

ANo.1です。



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

ご回答ありがとうございます。
アップロードしたファイルのサイズが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

アップロード時のエラーは(サイズオーバーも含め)$_FILES['userfile']['error'] で調べられます。

これをもとに処理すればよいのでは。
詳しくは以下を参照してみてください。
http://jp.php.net/manual/ja/features.file-upload …
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!