複数ファイルアップロード
一部のブラウザで可能な複数ファイルアップロードをした場合の処理をやってみた。
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ファイルずつアップロードさせるパターンが多いと思うが、複数ファイルの扱いって他に方法はないのだろうか?