ファイルアップロードのファイルサイズチェック

  • 15
    いいね
  • 4
    コメント
この記事は最終更新日から1年以上が経過しています。

ファイルをアップロードする時の最大のファイルサイズってのは実際のところ、エラーチェックできるんだろうか??

php.ini
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 も何も返さないってことだろう。

php.ini
upload_max_filesize = 2M

であり、しかも

php.ini
post_max_size = 2M

error_reporting(0); であったりなんかすると、もう何もわからない。(笑

つまり、upload_max_filesizepost_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);
});