PHP では、php.ini の upload_max_filesize を設定することによって 1ファイルあたりのファイルサイズの上限を設定することができます。しかし、ブラウザ側ではその上限を知らないため、(特に大きなファイルの場合)時間をかけてサーバにファイルをアップロード処理を行ってからサーバでのサイズ制限によってアップロードできないことを知るため、時間の無駄となってしまいます。
スポンサーリンク
そこで、HTML に MAX_FILE_SIZE を記述しておくことで、サイズ超過をアップロード前にブラウザが知ることができるようになります。以下が、サンプルになります。
HTML
<form action="upload.php" method="post" enctype="multipart/form-data"> <!-- MAX_FILE_SIZE でアップロードファイルのサイズを制限する(単位:バイト) --> <input type="hidden" name="MAX_FILE_SIZE" value="1500" /> アップロードするファイル: <input name="uploadfile" type="file" > <input type="submit" value="ファイルを送信" /> </form>
PHP ( upload.php )
// アップロードファイル情報の出力のみ print_r($_FILES);
動作確認結果
以下に示す動作結果は、upload_max_filesize の制限はオーバーしていない場合の結果です。
MAX_FILE_SIZE の制限を超えている場合
/* * サイズ制限をオーバーしていた場合のアップロード結果 */ Array ( [uploadfile] => Array ( [name] => bigsize.xls [type] => [tmp_name] => [error] => 2 (UPLOAD_ERR_FORM_SIZE) [size] => 0 ) )
MAX_FILE_SIZE の制限を超えていない場合
/* * サイズ制限内のファイルのアップロード結果 */ Array ( [uploadfile] => Array ( [name] => smallsize.txt [type] => text/plain [tmp_name] => C:\WINDOWS\Temp\php34.tmp [error] => 0 (UPLOAD_ERR_OK) [size] => 921 ) )
サーバー側( PHP )では、MAX_FILE_SIZE はブラウザ側で無視しようと思えば無視することができますので、この制限が必ず有効であることを前提にコーディングしてはいけません。
また、upload_max_filesize は1ファイルあたりの上限サイズの設定です。 複数ファイルの場合の合計値にも制限を掛ける場合には、同じく php.ini の post_max_size で POST 全体のサイズ上限を設定する必要があります。ファイルデータも POST の一部として計算されますので、常に post_max_size は upload_max_filesize より大きな値となっていなければいけません。
post_max_size > upload_max_filesize > MAX_FILE_SIZE
複数ファイルのアップロードと MAX_FILE_SIZE
未検証ですが、「PHP マニュアル:POST メソッドによるアップロード」によりますと、ファイル単位でファイルサイズの制限をかけることもできるようです。
<form enctype="multipart/form-data" action="__URL__" method="POST"> <!-- ファイルサイズ制限なし --> <input name="nolimit_1" type="file" /> <input type="hidden" name="MAX_FILE_SIZE" value="1000" /> <!-- ファイルサイズ制限(1000 バイト) --> <input name="limit1k_1" type="file" /> <input name="limit1k_2" type="file" /> <input type="hidden" name="MAX_FILE_SIZE" value="2000" /> <!-- ファイルサイズ制限(2000 バイト) --> <input name="limit2k" type="file" /> <input type="hidden" name="MAX_FILE_SIZE" value="0" /> <!-- ファイルサイズ制限なし MAX_FILE_SIZE : 0 バイト --> <input name="nolimit_2" type="file" /> </form>
参考