質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5904閲覧

PHPで複数のファイルをアップロードする

avantgarden

総合スコア121

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

2クリップ

投稿2016/07/24 02:11

編集2016/07/24 02:22
<input type="file" name="file[]" value=・・・> <input type="file" name="file[]" value=・・・>

とすると、$_FILESが

array(1) { ["file"]=> array(5) { ["name"]=> array(2) { [0]=> string(16) "filename1.jpg" [1]=> string(16) "filename2.jpg" } ["type"]=> array(2) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" } ["tmp_name"]=> array(2) { [0]=> string(14) "/tmp/phpD4efB1" [1]=> string(14) "/tmp/phppUztkd" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(0) } ["size"]=> array(2) { [0]=> int(0) [1]=> int(0) } } }

のようになります。$_FILESを

Array ( [0] => Array ( [name] => filename1.txt [type] => text/plain [tmp_name] => /tmp/phpYzdqkD [error] => 0 [size] => 123 ) [1] => Array ( [name] => filename2.txt [type] => text/plain [tmp_name] => /tmp/phpeEwEWG [error] => 0 [size] => 456 ) )

のようにしたいのですが、inputタグをどのように書けばいいのでしょうか。

name属性を「name1」「name2」のようにすればいけるのは分かるのですが、プログラム上name属性を配列で書かなければなりません。てっきりname属性を配列にしても$_FILESは同じような配列になると思ったのですが。

mpyw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PHPマニュアルのUser Contributed Notesのやり方は不十分なので,100%の信頼性のある方法を採用しましょう.

こちらの記事のやり方をベースにすればいいと思います.以下の実行結果を比較してみてください.

html

1<?php 2 3require 'vendor/autoload.php'; 4 5use Psr\Http\Message\UploadedFileInterface; 6use Zend\Diactoros\ServerRequestFactory; 7 8function normalize_files_array($files = []) 9{ 10 $normalized_array = []; 11 foreach($files as $index => $file) { 12 if (!is_array($file['name'])) { 13 $normalized_array[$index][] = $file; 14 continue; 15 } 16 foreach($file['name'] as $idx => $name) { 17 $normalized_array[$index][$idx] = [ 18 'name' => $name, 19 'type' => $file['type'][$idx], 20 'tmp_name' => $file['tmp_name'][$idx], 21 'error' => $file['error'][$idx], 22 'size' => $file['size'][$idx] 23 ]; 24 } 25 } 26 return $normalized_array; 27} 28 29function hvd(...$args) 30{ 31 ob_start(); 32 var_dump(...$args); 33 echo htmlspecialchars(ob_get_clean(), ENT_QUOTES, 'UTF-8'); 34} 35 36?> 37<!DOCTYPE html> 38 39<meta charset="UTF-8"> 40<title>Example</title> 41 42<form action="" method="post" enctype="multipart/form-data"> 43 <input type="file" name="f[a][x]"> 44 <input type="file" name="f[a][y]"> 45 <input type="file" name="f[b][x][s]"> 46 <input type="file" name="f[b][x][t]"> 47 <input type="file" name="f[b][y][s]"> 48 <input type="file" name="f[b][y][t]"> 49 <input type="submit"> 50</form> 51 52<h1>$_FILES</h1> 53<pre><?php hvd($_FILES) ?></pre> 54 55<h1>normalize_files_array($_FILES)</h1> 56<pre><?php hvd(normalize_files_array($_FILES)) ?></pre> 57 58<h1>ServerRequestFactory::fromGlobals()->getUploadedFiles()</h1> 59<pre><?php hvd(ServerRequestFactory::fromGlobals()->getUploadedFiles()) ?></h1>

ただし,私がQiitaの記事でコメントしているように,issetのチェックに加えてinstanceofのチェックも忘れないでください.

投稿2016/07/24 06:05

編集2016/07/24 06:06
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

avantgarden

2016/07/31 05:52

ノート参考にさせていただきます。 返答が遅くなり大変すみませんでした。
guest

0

POST メソッドによるアップロード

User Contributed Notes の2番目にそのものズバリのサンプルコードあり

投稿2016/07/24 03:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2016/07/24 06:06 編集

このやり方は3次元以上の多次元配列を想定していないため,バリデーションの面からみれば厳密には不十分な気はします. <?php function normalize_files_array($files = []) {     $normalized_array = [];     foreach($files as $index => $file) {         if (!is_array($file['name'])) {             $normalized_array[$index][] = $file;             continue;         }         foreach($file['name'] as $idx => $name) {             $normalized_array[$index][$idx] = [                 'name' => $name,                 'type' => $file['type'][$idx],                 'tmp_name' => $file['tmp_name'][$idx],                 'error' => $file['error'][$idx],                 'size' => $file['size'][$idx]             ];         }     }     return $normalized_array; } function hvd(...$args) {     ob_start();     var_dump(...$args);     echo htmlspecialchars(ob_get_clean(), ENT_QUOTES, 'UTF-8'); } ?> <!DOCTYPE html> <meta charset="UTF-8"> <title>Example</title> <form action="" method="post" enctype="multipart/form-data">     <input type="file" name="f[a][x]">     <input type="file" name="f[a][y]">     <input type="file" name="f[b][x][s]">     <input type="file" name="f[b][x][t]">     <input type="file" name="f[b][y][s]">     <input type="file" name="f[b][y][t]">     <input type="submit"> </form> <h1>$_FILES</h1> <pre><?php hvd($_FILES) ?></pre> <h1>normalize_files_array($_FILES)</h1> <pre><?php hvd(normalize_files_array($_FILES)) ?></pre> 例えばこれ相当のリクエストを送られたときに構造が崩れてしまいます.
退会済みユーザー

退会済みユーザー

2016/07/24 05:42 編集

私の回答の意図としては、コードの妥当性云々じゃなくて、リファレンスくらい読めってだけのことです。 それも、質問者自身が書いたタイトル「PHPで複数のファイルをアップロードする」これをそのままキーワードにして検索したら、先頭に出てくるページなのですから。
mpyw

2016/07/24 06:08

但し,今回に限ってはその情報は妥当なやり方とは言い切れず,これによって質問者さんが厳密に正しいと言えるやり方を知れるきっかけとなったので,結果的には良かったとは思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問