
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で質問しましょう!
似たような質問が見つかりました
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(パソコン・スマホ・電化製品) マイナンバーカードの写真をアップロードしたいんですが、 『ファイルのピクセルサイズが下限値に満たない 5 2023/05/05 12:13
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- Windows 10 この現象も、Microsoft Explorer のお粗末な仕様のためか? 2 2023/06/09 15:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルアップロードの上限を...
-
unlinkでどうしてもファイルが...
-
ファイルのアップロードでパス...
-
SmartyでHTMLソースの変更が反...
-
ファイルのアップロードで、フ...
-
ファイルをGET送信でアップロー...
-
one drive のアップロード失敗...
-
Struts2 ファイルアップロード
-
ファイルサイズがpost_max_size...
-
どうして送信されないのでしょ...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
「include()」関数の使い方につ...
-
makefile でファイルをコピーす...
-
.htaccessにphp_valueが使用できな
-
Subversionのリポジトリの削除
-
文字化けについて
-
別ファイルの変数を呼び出した...
-
sqlで日付が一番古いデータの月...
-
UWSCにつきまして
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onedrive にexcelファイルをア...
-
「クラウドにアップロード」」...
-
ftpでアップロードが出来ない
-
ファイルサイズがpost_max_size...
-
ファイルアップロードしたもの...
-
FTPClientで転送結果(OKかFAIL)
-
unlinkでどうしてもファイルが...
-
VBでクラウドストレージにア...
-
ファイルのアップロード
-
movabletypeでPDFファイルをア...
-
phpファイルの編集について
-
BASP21のFTPで日本語ファイル名...
-
違法アップロードについて
-
掲示板のアイコンについて
-
ファイルのアップロードが、ど...
-
SmartyでHTMLソースの変更が反...
-
Googleドキュメントについて教...
-
HTMLファイルのアップロードに...
-
お悩み相談です(※長文な上にか...
-
gif画像をアップロードするには?
おすすめ情報