いつもPHPでファイルアップロードについて調べちゃうのでまとめておく
そうなんですよね。こうした機能を実装する時に調べ時間が数分発生するので、自分用のメモとしてまとめておくことに。
ちなみに、最もシンプルな実装でエラーハンドル等も記述してない。そこは個々人のプロジェクトの環境(誰向けかとかね)やポリシ(エラーハンドルに関する)に従って真面目にやって欲しいと思います。ここでは語りません。
余談ですが、ユーザにファイルアップロードというか入力オペをさせるケースでは、その入力値検証を真面目にやるべきで、ファイルアップロードももちろん考慮が必要です。@mpyw さんがとても良くまとめられている記事があるので是非参考になさってください。
また、正常系のエラーチェック(ファイル種別等による)はこちらのページが参考になります。
PHPで複数ファイルのアップロード
index.php
<?php
// ファイルがあれば処理実行
if(isset($_FILES["upload_file"])){
// アップロードされたファイル件を処理
for($i = 0; $i < count($_FILES["upload_file"]["name"]); $i++ ){
// アップロードされたファイルか検査
if(is_uploaded_file($_FILES["upload_file"]["tmp_name"][$i])){
// ファイルをお好みの場所に移動
move_uploaded_file($_FILES["upload_file"]["tmp_name"][$i], "./images/" . $_FILES["upload_file"]["name"][$i]);
}
}
}
?>
<html>
<head>
<meta charset="utf-8">
<title>ふぁいるあっぷろーどする</title>
</head>
<body>
<form aciton="./" method="post" enctype="multipart/form-data">
<input type="file" multiple name="upload_file[]" />
<input type="submit" value="そうしん!" />
</form>
</body>
HTML側のポイントは3点。
- enctype="multipart/form-data" をformに設定しておく
- input type="file"にmultiple属性を設定しておく
- input type="file" のname属性はname="xxx[]"のように配列的にしておく
です。
サーバ側は、$_FILESに値がセットされてくるので、input[file]のname属性で指定したキーで値を抜いて、あとはループしてファイルをお好きなところに移動するだけです。
一番最初に書いた通り、ここではホントは色々エラーチェックしないと危ないので、必要に応じて処理を入れ込みます。
以上です。