はじめに
複数画像を指定のディレクトリにアップロードしたいシーンがあったので、忘れないようにここにまとめます。
実装
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="files[]" multiple>
<input type="submit" value="アップロード">
</form>
foreach ($_FILES["files"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["files"]["tmp_name"][$key];
$name = basename($_FILES["files"]["name"][$key]);
$upload_path = "./img/".$name; //upload先のパス
move_uploaded_file($tmp_name, $upload_path);
}
}
複数画像アップロード
enctype="multipart/form-data"
画像をアップロードするためにはフォームでenctype="multipart/form-data"
を指定する必要があります。
enctype属性は、フォームの送信データのMIMEタイプを設定するための属性です。
属性値にMIMEタイプを示す文字列を指定することで、フォームのデータが送信される際に用いられるMIMEタイプを設定することができます。
type属性の値に「file」が設定されたinput要素をフォームに用いる際は、enctype属性の値に「multipart/form-data」を指定する必要があります。
引用元:enctype属性 | 用語集 | ミツエーリンクス
multiple
multiple属性を設定することで、フォームコントロールが1つ以上の値を受け入れられるようになります。また、name部分でfiles[]
のように指定することで、同じnameで配列として取得することができます。
アップロードファイルの移動
POSTされたデータについて
$_FILES
にPOSTされたデータが格納されています。以下に、$_FILESの詳細について記載します(※userfileはinputのnameを指しています)。
-
$_FILES['userfile']['name']
クライアントマシンの元のファイル名。 -
$_FILES['userfile']['type']
ファイルの MIME 型。ただし、ブラウザがこの情報を提供する場合。 例えば、"image/gif" のようになります。 この MIME 型は PHP 側ではチェックされません。そのため、 この値は信用できません。 -
$_FILES['userfile']['size']
アップロードされたファイルのバイト単位のサイズ。 -
$_FILES['userfile']['tmp_name']
アップロードされたファイルがサーバー上で保存されているテンポラ リファイルの名前。 -
$_FILES['userfile']['error']
このファイルアップロードに関する エラーコード -
$_FILES['userfile']['full_path']
ブラウザからアップロードされたファイルのフルパス。 この値は実際のディレクトリ構造を反映しているとは必ずしも言えないため、 信用できません。 PHP 8.1.0 以降で利用可能です。
今回は、name
、tmp_name
、error
を使います。
UPLOAD_ERR_OK
はエラーがなく、ファイルのアップロードに成功した場合のことです(値:0)。
そのほかにもエラーによって値が決まっているため、詳細は公式ドキュメントを。
ファイルの移動
ファイルアップロードに成功したら、一時ファイルの名前(tmp_name)とファイルの名前(tmp_name)を取得し、move_uploaded_file()
で指定の場所に移動させています。
まとめ
今回は、PHPで複数画像のアップロードとアップロード先の指定方法についてまとめました。
以上。