PHPのファイルアップロード処理

HTTPアップロードの設定

php.iniの設定
file_uploads
HTTPアップロードの有効無効の切り替えを行う。

ファイルサイズの制限設定

php.iniの設定
memory_limit
PHPスクリプトが確保できる最大メモリのバイト数。
  • コンパイル時に--enable-memory-limitオプションが含まれている必要がある。
  • スクリプト中で割り当てられたメモリ量を参照するにはmemory_get_usage()を用いる。
post_max_size
POSTデータに許容される最大サイズの設定。(バイト単位)
  • 実際にPOSTされたデータがこの指定よりも大きかった場合、$_POSTおよび$_FILESは空になる。
upload_max_filesize
アップロードされるファイルの最大サイズ。(バイト単位)
  • 実際にアップロードされたファイルがこの指定よりも大きかった場合、$_FILES['userfile']['error']に”1(エラーコード:UPLOAD_ERR_INI_SIZE)”がセットされる。
Apache設定
LimitRequestBody (Apacheディレクティブ)
サーバが許容するHTTPリクエストボディの容量。(バイト数)
  • デフォルトでは無効(無制限)。
  • 0 (無制限) 〜2147483647(2GB)が設定可能。
HTML内の指定
HTML中のINPUTタグ (type="hidden" name="MAX_FILE_SIZE" value="*****"
ブラウザ側でのアップロードファイルの容量制限に用いる。
※ 最近のブラウザではこの指定を無視するものが多い。

パース処理時間の制限設定

max_input_time
PHPスクリプトが入力をパースする最大時間。(秒単位)
  • デフォルトでは60秒。
その他の時間制限の設定
max_execution_time
スクリプト自体の実行時間の制限。(秒単位)
  • システムコール、ストリーム操作、DBクエリ等の実行時間は含まない
  • デフォルトでは30秒。
Timeout (Apacheディレクティブ)
リクエスト到達待ち受け時間の制限。(秒単位)
  • デフォルトでは300秒。
処理の流れ
Timeout ⇒ max_input_time ⇒ max_execution_time
入力待ち   入力受付け中      処理実行

アップロードファイルの処理手順

  1. アップロードファイルの情報取得
    ⇒ オートグローバル変数$_FILES”により取得。
  2. アップロードファイルの検証および移動
    is_uploaded_file()により、テンポラリディレクトリに保存されたファイルを検証。
    または、move_uploaded_file()により、任意の恒久的な保存領域へ移動。
    cf.
    • テンポラリディレクトリはupload_tmp_dirディレクティブで指定した場所。
    • 一時保存されたファイルのパスは$_FILES['userfile']['tmp_name']で参照可能。
  3. 処理対象のファイルであるかフィルタリング。
    ⇒ サイズ、MIMEタイプ、エラーコードなどに基づき分別。
  4. ファイルの処理

アップロードファイルのファイル名の文字エンコーディング

オートグローバル変数$_FILE”内のファイル名データ($_FILES['userfile']['name'])の文字エンコーディングは、ブラウザがどの文字エンコーディングで(ファイルを投稿した)HTMLフォームを表示していたかに依存する。 参考: ブラウザにおける表示用文字エンコード決定順位