ファイルは、HTMLの<input type="file">からアップロードさせられます。そしてそのファイルについては、定義済み変数の$_FILESで情報を取得できます。
ファイルのアップロードをサポートするには、サーバを適切に設定する必要があります。
これらの設定は、ini_set()で実行時に変更できません。
大きなサイズのファイルを扱う場合、スクリプトの最大実行時間以内に処理が終了しないと、スクリプトは強制終了させられます。
たとえば次のようなフォームから、ファイルが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属性の値をキーとして、結果は配列に格納されます。そしてその配列要素に各ファイルの情報が、これもまた配列として格納されます。
要素名 | 説明 |
---|---|
name | ファイル名 |
type | MIMEタイプ |
tmp_name | 一時ファイルのパス |
error | エラーコード |
size | ファイルサイズ [byte] |
番号 | コードの定数 | 説明 |
---|---|---|
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の拡張モジュールがファイルのアップロードを中止した |
MAX_FILE_SIZEフィールドで、転送時のファイルサイズの上限を設定できます。単位は「byte」です。
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
これは<input tye="file" />より先に記述する必要があります。
アップロードできるファイルサイズの上限は、
の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 );
とします。