複数ファイルアップロード

一部のブラウザで可能な複数ファイルアップロードをした場合の処理をやってみた。

view側の記述

<?php echo $this->Form->input('Model.filename', array('type' => 'file','multiple'=>'multiple')); ?>

出力されるタグ

<input type="file" name="data[Model][filename]" multiple="multiple" id="ModelFilename" />

controllerでいつもの$this->data[Model]で受け取れるのを期待していたのだが、複数ファイルのはずが1ファイル分しかデータがとれない。

ちなみに期待した形式は

Array
(
    [Model] => Array
        (
            [filename] => Array
                (
                    [0] => Array
                        (
                            [name] => 
                            [type] => 
                            [tmp_name] => /tmp/xxxxxx
                            [error] => 0
                            [size] => 0
                        )

                    [1] => Array
                        (
                            [name] => 
                            [type] => 
                            [tmp_name] => /tmp/zzzzzz
                            [error] => 0
                            [size] => 0
                        )
                )

        )
)

なのだが、debug($this->data)の出力結果はこうだった。

Array
(
    [Model] => Array
        (
            [filename] => Array
                (
                    [name] => 
                    [type] => 
                    [tmp_name] => 
                    [error] => 4
                    [size] => 0
                )

        )
)

念のため debug($this->params)を見てみたところ

    [form] => Array
        (
            [files] => Array
                (
                    [name] => Array
                        (
                            [0] => file1.png
                            [1] => file2.png
                        )

                    [type] => Array
                        (
                            [0] => image/png
                            [1] => image/png
                        )

                    [tmp_name] => Array
                        (
                            [0] => /tmp/xxxxxxxxx
                            [1] => /tmp/zzzzzzzzz
                        )

                    [error] => Array
                        (
                            [0] => 0
                            [1] => 0
                        )

                    [size] => Array
                        (
                            [0] => 1234
                            [1] => 5678
                        )

                )

        )

結局、ファイルを一つずつチェックしたり処理をするのに不便なので、最初に期待した形式になるように詰め替えを行った。

$files = array();
foreach($this->params['form']['filename'] as $key=>$value){
    foreach($value as $indx=>$data)
        $files[$indx][$key]=$data;
}

Ajaxを使って1ファイルずつアップロードさせるパターンが多いと思うが、複数ファイルの扱いって他に方法はないのだろうか?