• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルサイズがpost_max_sizeを超える場合のエラー処理について)

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

このQ&Aのポイント
  • PHPでアップロードファイルのサイズチェックに関する処理で困っています。ファイルサイズがpost_max_sizeを超える場合、ユーザーにエラーを知らせる方法を教えてください。
  • アップロードファイルのサイズチェックを行う場合、一般的にはPHPスクリプト内でスーパーグローバール変数の$_FILES[フォーム名]['size']から行います。しかし、php.iniのパラメーターpost_max_sizeを超えるサイズのファイルをアップロードしようとすると、ファイルのアップロードが行われず、ユーザーにエラーを通知することができません。
  • 以下の2つの方法を試しましたが、ユーザーに正確なエラーを返すことができませんでした。1.HTMLのFORMタグ内にMAX_FILE_SIZEを指定する。2.ブラウザ側スクリプトでファイルサイズを取得する。もっと良い方法を教えていただけないでしょうか?

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

  • ベストアンサー
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.3

ANo.1です。 実際に確認してみました。確かにpost_max_sizeを超える場合はポストデータ自体が取得できませんでした。 適当なことを書いていたようです、申し訳ないです。 で、ちょっと調べてみたところ、$_POST、$_FILESは取得できなくても$_SERVERのCONTENT_LENGTHで判断するという方法があるようです。 http://q.hatena.ne.jp/1193396523

monmo__
質問者

お礼

たびたびご回答ありがとうございます。 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を受け付けてしまうことになるので好ましくありませんね。 最後になりましたが今回は、本当にありがとうございました! とても助かりました!!

その他の回答 (2)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

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

monmo__
質問者

お礼

ご回答ありがとうございます。 アップロードしたファイルのサイズがupload_max_filesizeよりも大きくて、post_max_sizeよりも小さい場合は意図したエラー処理を行えますが、upload_max_filesizeをいくつに設定してもpost_max_sizeを超えた場合のエラーは取れないようです。 post_max_sizeを超えたファイル(ほかのPOSTデータも含んだ合計サイズが超えた場合です)をアップロードした時点で、POST自体が無効になるようです。 なので、PHP側でエラー処理などが行えません。 あれからずっといろいろ調べていますが、良い方法が見つかりません・・・ OpenPNEのようなオープンソースアプリでもpost_max_sizeを超えたPOSTに対するエラー処理は考慮されていませんので、もしかしたらエラーなんて気にしないのがスタンダードなのでしょうか・・・

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

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

monmo__
質問者

お礼

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