LoginSignup
31
32

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-26

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

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);
});
31
32
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
32