Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

PHPの$_FILES変数に悩まされた話

node.jsの話はとりあえず置いといて、、、(汗)

他のプロジェクトで使っているPHPの処理の中で$_FILESの扱いに困ったので記録として残しておきます。(以下、信ぴょう性はいまいちですのでご了承ください)

何がしたかったのかというと、「複数ファイルを送信の際、$_FILESの中身があるかどうかの判定をする」ただそれだけです。

ですが、HTMLのformにて<input type='file' name='hoge[]' >があるだけで、isset($_FILES['name])はtrueを返します。それじゃ、中身はどうなっとんやと思いvar_dump($_FILES['name])を出力しようとしたが出ない。

ということで、リファレンスを見ると$_FILESの配列の形がへんてこであると気づく。今回は複数ファイルを送信することもあり、

['hoge'](

     ['name'](

           [0] => test1.txt,

           [1] => test2.txt

    )

...etc

)

という形で格納されていました。

僕は以下の形で入ってると思っていたので驚きました

['hoge'](

     [0](

           ['name] => test1.txt,

          ....

    )

    [1](

        ['name'] => test2.txt,

        .....

    )

)

 

以下のリンクに詳細が書いてあります。(配列の形を、へんてこ=>下の形への変形の方法も書いてあります。)

PHP: 複数ファイルのアップロード - Manual

 

僕は最終的に

foreach($_FILES['hoge']['name'] as $file){

   empty($file[name])'true処理':'false処理' ;

}

と書いて判定を行いました。empty関数を使ったのは、isset関数だと空の文字列でもtrueを返してしまうためです(ファイルが何もアップロードされなかった場合['name'] => ""となる)。

 

こんなことをする必要があったのかは甚だ疑問ですが、残しておきます。