大容量ファイルアップロードに関係するPHP・Apacheの設定

投稿日:2013年3月1日

大容量ファイルアップロードに関係するPHP・Apacheの設定をまとめました。

まず、ファイルアップロードページ等を作りたい場合、

upload.html


・・・
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="submit" value="送信">
</form>
・・・
  

のようにフォームを作成すれば、サーバの「/tmp」などのディレクトリにファイルがアップロードされます。
しかし、このディレクトリは一時ファイル保存用ディレクトリなので、
アップロードリクエストが終了すると、せっかくアップロードしたファイルを削除してしまいます。
そこで、上のフォームで指定した「upload.php」の中でアップロードしたファイルを移動してやります。
例えばこんな感じです。

upload.php


・・・
$tmp_name = $_FILES["file"]["tmp_name"];
$upload_path = "";  // ファイルを実際にアップロードしたいディレクトリ
  if (is_uploaded_file($tmp_name)) {
    if (move_uploaded_file($tmp_name, $upload_path)) {
      echo 'アップロード成功!';
    } else {
      echo 'ファイル移動エラー';
    }
  } else {
    echo 'アップロードエラー';
  }
・・・
  

is_uploaded_file()関数とmove_uploaded_file()関数は、
正しい方法でアップロードされたファイルかどうかをチェックする関数なので
利用した方が良いでしょう。

さて、本題ですが、
小さめのデータならこれでいいのですが、
どうしても大きめのデータ(ex. 1GB程度)をアップロードしたい!という場合、
PHPの設定やApacheの設定がデフォルトのままだとアップロードできません。
(デフォルトは2MBまで)

PHPの設定ファイルphp.iniでアップロード関連の設定を変えてやる必要があります。
php.iniを直接編集してもいいですが、.htaccessで設定する方が都合が良い時が多いです。
例えば・・・、

.htaccess


php_value file_uploads On
php_value upload_max_filesize 2000M
php_value post_max_size 2000M
php_value memory_limit 3000M
php_value max_execution_time 300
php_value max_input_time 300

LimitRequestBody 2147483647
  

このような設定にすると2GB(程度)までの大容量データをアップロードできます。

上に書いた中で、「LimitRequestBody」に関しては、
実際にはphp.iniの中ではなく、
Apache関連の設定ファイルphp.confで設定されているものです。

ファイルが大きすぎる、回線が遅い、など、
アップロードに300秒以上かかるファイルを対応させる場合は、
Apacheの設定ファイルhttpd.confの中の「Timeout」項目を変更してやる必要があります。
(ついでに上の設定の *_time 関係も変更)
ちなみに、「Timeout」の項目は.htaccessでは設定できません。

南本貴之

カテゴリー: PHP, WEB
  • LINEスタンプ販売中!「カフィーノ♪」 BRISKオリジナル