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

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

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";
        }
    }
}


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

1週間の振り返り(2017/4/15〜2017/4/21)

ひとり飯の機会があったので、初めてのラーメン屋に行ってみました。
f:id:AJYA:20170422223647p:plain
白らぁめん美味しかったです。

  • 2017/4/15(土)
    歯医者通いが終わりました。
    昨年10月末から月2回くらいのペースだったので長かったです。
  • 2017/4/16(日)
    妻と子どもは、ママ友と一緒に出かけました。
    午後迎えに行くまでの数時間一人でしたが、いろいろあって予定していたことがあまりこなせなかったです。
  • 2017/4/17(月)
    これまでずっと案件を依頼されている会社から、新しい案件の見積依頼がありました。
    これまでの依頼とは全く異なる内容なので、担当を誰がするかなど、新たな体制が必要そうです。
  • 2017/4/18(火)
    年に1度の設定作業をしていました。
    毎年同じことをしていますが、読んでもっとこうした方がわかりやすいと思ったので、手順書を修正していました。
    来年もあれば、これで迷う時間を数秒でもなくせるはずです。
  • 2017/4/19(水)
    案件への余分な対応に疲れました。
    案件本来の作業に集中したいです。

ajya.hatenablog.jp

  • 2017/4/20(木)
    ファイルのアップロード機能を、1ファイルから複数ファイルに対応するために修正していました。
    登録はできるようになったので、差し替えができるようになれば完成です。
  • 2017/4/21(金)
    データの移行のための作業は前日終わりましたが、正常に終わったという書類を作成しなければならず、大量に印刷して大量にスキャンしていました。
    1日がかりでなんとか必要な書類の作成が終わりました。

ajya.hatenablog.jp


昨年から続いていたデータの移行の案件がいよいよ本番作業を実施となりました。
この案件が終わると、随分気持ちが楽になれそうです。

自分の都合を最優先にしたい人

昨日とおとといの記事に登場する依頼元の、別の方の話です。
ajya.hatenablog.jp
ajya.hatenablog.jp

納期の調整など、手間がかかることが終わり、落ち着いて仕事ができる状態になったので、あるシステムの作成に時間をかけていました。
そんな時間に電話がかかってきました。

以前から依頼されていた方で、新規にシステムを依頼したいということでした。
どれくらいで出来るのかという話になったので、現状手いっぱいなのですぐには着手できない旨を伝えました。
そうすると、「他の案件を飛ばしてください。」と言われました。

f:id:AJYA:20170421230911j:plain
photo credit: Don Voaklander USports-Track&Field DAY 2-2017-2724 via photopin (license)

担当の方は冗談なんでしょうけど、そこには触れず、必要なことを話して電話を終わりました。

IT部門の方経由で納期の調整をした後だったので、IT部門の方に、先日どんなことがあって、どうなったのかということを聞いてくださいと言うべきだったかと後から思いました。

以前から自分の案件を優先して欲しいことを言外に伝えてこれていたので、「他の案件を飛ばしてください。」と言われるのにも納得です。
こういう人は、自分の案件が「飛ばされた」となったら、激しい感情をむき出しにして、文句を言われるんでしょうね。


声が大きい人の案件を優先すると、声が大きい人の案件が複数あったときにどうにもならない状態になりそうです。
確定した案件から順番に作成していくというルールを守るのが先方もわかりやすいでしょうし。