HTML5 で追加された multiple 属性を使うと 1つの input タグから 複数のファイルをアップロードすることができます。
<input type="file" ... multiple>
見た目(↓はFirefox)は、 multiple 属性を付けない場合と同じです。
ファイルを選択するときに 複数選択できます。
ファイルの選択後、 Firefox では 選択したファイル数が表示されます。
ファイルを 1 つしか選択しない場合は multiple 属性を付けない場合と同じで 選択したファイル名が表示されます。
次に サーバ側の PHP で multiple 属性を使った input タグから 複数のファイルを受けてみます。
まず ダメなパターンですが、 <input> タグに test_files という 名前を付けます。
<input type="file" name="test_files" ... multiple>
"1.txt" と "2.txt" を選択して送信(submit)します。
PHP 側で $_FILES の内容を出力してみます。
var_dump($_FILES['test_files']);
array(1) { ["test_files"]=> array(5) { ["name"]=> string(5) "2.txt" ["type"]=> string(10) "text/plain" ["tmp_name"]=> string(14) "/tmp/php2zriSB" ["error"]=> int(0) ["size"]=> int(1610229) } }
ファイルを複数送信したのに "2.txt" しかありません。
これは PHP で 1つの名前で複数の値を送る場合 input タグの名前を配列にしないとならないからです。 (通常のテキストボックスやラジオボタンなどでも同様です)
名前に [] を付けて配列の指定にします。
<input type="file" name="test_files[]" ... multiple>
array(1) { ["test_files"]=> array(5) { ["name"]=> array(2) { [0]=> string(5) "1.txt" [1]=> string(5) "2.txt" } ["type"]=> array(2) { [0]=> string(10) "plain/text" [1]=> string(10) "plain/text" } ["tmp_name"]=> array(2) { [0]=> string(14) "/tmp/php3MKNhg" [1]=> string(14) "/tmp/phpyJ9uB0" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(0) } ["size"]=> array(2) { [0]=> int(310934) [1]=> int(1610229) } } }
今度は、上のような内容で受け取れました。
対応していないブラウザでも、今までと同じ動作ができるのが良いですね。