ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:複数ファイルのアップロードへの対応方法

ファイルアップロードが複数になった場合、どのようなコードを書けばいいのかわかりづらいので、メモとして書いていきます。

f:id:AJYA:20170423234600j:plain
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";
        }
    }
}


分かってしまえば簡単な内容です。