ファイルのアップロード

ファイルは、HTMLの<input type="file">からアップロードさせられます。そしてそのファイルについては、定義済み変数の$_FILESで情報を取得できます。

サーバの設定

ファイルのアップロードをサポートするには、サーバを適切に設定する必要があります。

  • file_uploads … ファイルアップロードの有効/無効
  • upload_tmp_dir … 一時ファイルのディレクトリ
  • max_file_uploads … 同時アップロードの最大数
  • upload_max_filesize … アップロードの最大ファイルサイズ

これらの設定は、ini_set()で実行時に変更できません。

その他の設定

  • post_max_size … POSTデータの最大サイズ
  • memory_limit … スクリプトのメモリ上限
  • max_execution_time … スクリプトの最大実行時間

大きなサイズのファイルを扱う場合、スクリプトの最大実行時間以内に処理が終了しないと、スクリプトは強制終了させられます。

アップロードされたファイルの情報 ($_FILESの内容)

たとえば次のようなフォームから、ファイルがPOSTされた場合を考えます。

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file1" />
    <input type="file" name="file2" />
    <input type="submit" />
</form>

file1にテキストファイルを、file2には画像ファイルが指定されたならば、$_FILESの内容は以下のようになります。

Array
(
    [file1] => Array
        (
            [name] => sample.txt
            [type] => text/plain
            [tmp_name] => C:\temp\phpA4F0.tmp
            [error] => 0
            [size] => 4
        )

    [file2] => Array
        (
            [name] => sample.jpg
            [type] => image/jpeg
            [tmp_name] => C:\temp\phpA4F1.tmp
            [error] => 0
            [size] => 13844
        )

)

input要素のname属性の値をキーとして、結果は配列に格納されます。そしてその配列要素に各ファイルの情報が、これもまた配列として格納されます。

$_FILESの各要素の内容
要素名 説明
name ファイル名
type MIMEタイプ
tmp_name 一時ファイルのパス
error エラーコード
size ファイルサイズ [byte]
PHP: $_FILES - Manual
エラーコード
番号 コードの定数 説明
0 UPLOAD_ERR_OK エラーはなく、ファイルアップロードは成功している
1 UPLOAD_ERR_INI_SIZE アップロードされたファイルは、php.iniのupload_max_filesizeディレクティブの値を超えている (ファイルサイズの制限)
2 UPLOAD_ERR_FORM_SIZE アップロードされたファイルは、HTMLフォームで指定されたMAX_FILE_SIZEを超えている (ファイルサイズの制限)
3 UPLOAD_ERR_PARTIAL アップロードされたファイルは、一部のみしかアップロードされていない
4 UPLOAD_ERR_NO_FILE ファイルはアップロードされていない
6 UPLOAD_ERR_NO_TMP_DIR テンポラリフォルダがない
7 UPLOAD_ERR_CANT_WRITE ディスクへの書き込みに失敗した
8 UPLOAD_ERR_EXTENSION PHPの拡張モジュールがファイルのアップロードを中止した
PHP: エラーメッセージの説明 - Manual

実行例

転送時のファイルサイズの制限

MAX_FILE_SIZEフィールドで、転送時のファイルサイズの上限を設定できます。単位は「byte」です。

<input type="hidden" name="MAX_FILE_SIZE" value="1024" />

これは<input tye="file" />より先に記述する必要があります。

アップロードできるファイルサイズの上限は、

  • upload_max_filesize … アップロードの最大ファイルサイズ
  • post_max_size … POSTデータの最大サイズ
  • memory_limit … スクリプトのメモリ上限

の3つのサーバ設定にも制約を受けます。これらの3つの値は、

upload_max_filesize <= post_max_size <= memory_limit

の関係になるように設定します。PHP: 陥りやすい落とし穴 - Manual

ファイルの保存

アップロードされたファイルは一時ファイルとして扱われるため、処理の終了時には削除されてしまいます。もしファイルを保存する必要があるならば、一時ファイルを別の場所へコピーします。

bool move_uploaded_file (
    string $filename ,
    string $destination
    )
PHP: move_uploaded_file - Manual

ファイル$filenameを、ファイル$destinationへ移動します。

アップロードされたファイルのパスは、$_FILES[ $name ][ 'tmp_name' ]で取得できます。よって、たとえばアップロードされたファイルを、同名でスクリプトのパスに保存するならば、

$temp = $_FILES[ $name ][ 'tmp_name' ];
$dest = $_FILES[ $name ][ 'name' ];

move_uploaded_file( $temp, $dest );

とします。