ファイルをアップロードする時の最大のファイルサイズってのは実際のところ、エラーチェックできるんだろうか??
upload_max_filesize = 2M
php.ini にこんな風に設定されているとして、2Mを超えるようなファイルをpostすると、もうそれはプログラム側ではエラー検知できないような気がするんですよね。
filesize($_FILES["file"]["tmp_name"])
ファイルサイズを調べるって言ったって、この$_FILES
に値が入ってこない訳でしょ。
。。。と思ったのだが、その後コメントをもらっていろいろテストしてみたところ、間違っていたので修正する。
書き直し
上記のソースは $_FILES["file"]["tmp_name"]
のファイルサイズを取得しようとしている訳で、そもそもファイルサイズ超過の時は $_FILES["file"]["tmp_name"]
が空なのだ(汗
出る訳がない。
ということで
$_FILES["file"]["size"]
を使う。それ以前に
$_FILES["file"]["error"]
も使うべきだろう。これが1だったらphp.iniの設定値超過。2だったらhiddenで指定したMAX_FILE_SIZE超過だ。
ちなみにファイルを選択しないでsubmitすると4になる。
2Mというのは、 2 x 1024 x 1024 = 2097152 バイトだ。
なので、フォームには
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<input type="file" name="file" id="file">
<input type="submit">
</form>
としておく。php.iniはいじれないレンサバだったら .htaccessに
php_value upload_max_filesize 2M
としておく。
後は好きなようにエラー処理を書けばよい。
if ($_FILES["csv"]["error"] !== '0') {
$error[] = "ファイルアップロードに失敗しました。";
}
じゃあ問題はなんだろう。ファイルサイズが大きくて、post_max_size をも超えてしまうと $_FILES
も $_POST
も何も返さないってことだろう。
upload_max_filesize = 2M
であり、しかも
post_max_size = 2M
で error_reporting(0);
であったりなんかすると、もう何もわからない。(笑
つまり、upload_max_filesize と post_max_size を同じサイズにしたら絶対だめだ。
もちろんここで memory_limit が2Mだっりしてもエラーだが、さすがにそれくらいは忘れないだろう。
jQueryでやる場合は以下。古いIEでは動かない。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input type="submit">
$('#file').on("change", function() {
var file = $(this).prop('files')[0];
alert(file.name);
alert(file.type);
alert(file.size);
});