概要
HTML側でアップロードされたファイルをPHP側で受け取り、妥当性のチェック、所定の場所への保存などを行う最低限の手順。
HTML側でのファイル選択
- FORM要素で
enctype="multipart/form-data"
を指定する - INPUT要素で
type="file"
を指定し、サーバー側で参照するためのname属性を設定する - 複数ファイルを送る場合はINPUT要素に
multiple="multiple"
を指定する
1 2 3 4 |
<form method="post" enctype="multipart/form-data"> <input type="file" name="任意の名前"> <input type="submit" value="アップロード"> </form> |
HTML表示の際、デフォルトで”ファイルを選択”ボタンが表示され、これをクリックするとダイアログによるファイル選択が可能となる。
PHPで受け取る値
HTML側からの結果が受信されたとき、スーパーグローバル変数$_FILES
に連想配列としてアップロードされたファイルの情報が格納される。以下、'name値'
はINPUT要素で指定されたname属性の値。
$_FILES['name値']['error']
- エラーコード。PHPで定義された定数でエラーステータスを確認可能。(PHP-manual)
$_FILES['name値']['name']
- アップロードファイル名。
$_FILES['name値']['tmp_name']
- アップロードされたファイルのフルパス。
$_FILES['name値']['type']
- アップロードファイルのMIMEタイプを取得。たとえばimage/jpeg、image/pngなど。
$_FILES['name値']['size']
- アップロードされたファイルのサイズ
PHP側の処理
INPUT要素を受け取ったPHP側での最低限の処理の流れは以下のとおり。
$_FILES['name値']['error'] === UPLOAD_ERR_OK
でアップロード時のエラーをチェック- 以下の変数を設定
$image_file_name = $_FILES['name値']['name'];
$tmp_name = $_FILES['name値']['tmp_name'];
$type = $_FILES['name値']['type'];
is_uploaded_file($tmp_name)
でアップロードファイルの妥当性をチェック$type === 'image/jpeg' && $type !== 'image/png'
でファイルタイプをチェックmove_uploaded_file($tmp_name, IMAGE_DIR . $image_file_name);
でアップロードされたファイルを任意のディレクトリー(この場合IMAGE_DIR
)に移動- この実行結果の
true/false
に応じてファイル名のデータベースへの登録などの処理を実行
- この実行結果の
$_FILES['name値']['type']
ユーザーから送信されたものなので、偽装・改竄に対する完璧な防御にはならないが、上記は最低限の流れ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if ($_FILES['name属性値']['error'] === UPLOAD_ERR_OK) { $image_file_name = $_FILES['name属性値']['name']; $tmp_name = $_FILES['name属性値']['tmp_name']; $type = $_FILES['name属性値']['type']; if (is_uploaded_file($tmp_name)) { // 現時点では外面的なチェックのみ if ($type === 'image/jpeg' || $type === 'image/png') { if (move_uploaded_file($tmp_name, イメージファイル保存先のパス)) { 画像ファイル名追加等の内部処理 } else { ファイル移動失敗処理 } } else { ファイルタイプがJPG/PNG以外の場合の処理; } } else { 不適切なアップロードファイルの場合の処理 } } else { ファイルがアップロードできなかった場合の処理 } |