PHP:複数ファイルのアップロードへの対応方法
ファイルアップロードが複数になった場合、どのようなコードを書けばいいのかわかりづらいので、メモとして書いていきます。
photo credit: FootMassagez Coding a program - Credit to https://costculator.com/- Credit to https://costculator.com/ via photopin (license)
アップロードフォームのファイルの処理部分
以下の例は4ファイルのアップロードの場合です。name属性がfile[0]~file[3]の配列になっています。
受け取る側のファイルの処理部分で、セッション変数$_SESSION["uploadname"][0]~$_SESSION["uploadname"][3]にアップロード後のサーバー上のファイル名を設定します。
選んだファイル名を、セッション変数$_SESSION["filename"][0]~$_SESSION["filename"][3]に同時に設定します。
<?php for ($loop = 0; $loop < 4; $loop++) { ?> <input type="file" name="file[<?php echo $loop; ?>]" id="file<?php echo $loop; ?>"> <?php if($_SESSION["uploadname"][$loop]){ ?> <br> Uploaded file:<a href="./upfile/<?php echo $_SESSION["uploadname"][$loop]; ?>" target="_blank"><?php echo $_SESSION["filename"][$loop]; ?></a> <?php } ?> <br> <?php } ?>
受け取る側のファイルの処理部分
name属性がfile[0]~file[3]の配列になっているので、$_FILES["file"]["tmp_name"][0]~$_FILES["file"]["tmp_name"][3]の配列にそれぞれファイルのアップロードがされているかチェックをして処理をしています。for ($loop = 0; $loop < 4; $loop++) { $fileUploadErrMsg[$loop] = ""; if (is_uploaded_file($_FILES["file"]["tmp_name"][$loop])) { // ファイルの拡張子を取得する $extArr = explode(".", $_FILES["file"]["name"][$loop]); $index = count($extArr) - 1; $ext = strtolower($extArr[$index]); // セッションにファイル名があったら(既にアップロード済のファイルがあったら)消す if (file_exists("./upfile/" . $_SESSION["uploadname"][$loop]) && is_file("./upfile/" . $_SESSION["uploadname"][$loop])) { @unlink("./upfile/" . $_SESSION["uploadname"][$loop]); } // ファイル情報をセッションにいれる $_SESSION["filename"][$loop] = $_FILES["file"]["name"][$loop]; $_SESSION["uploadname"][$loop] = $loop . "_." . $ext; // ファイルをテンポラリから移動する if (move_uploaded_file($_FILES["file"]["tmp_name"][$loop], "./upfile/" . $_SESSION["uploadname"][$loop])) { chmod("./upfile/" . $_SESSION["uploadname"][$loop], 0644); } else { $fileUploadErrMsg[$loop] = "File not upload"; } } }
分かってしまえば簡単な内容です。