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

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

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

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

Q&A

解決済

2回答

850閲覧

【ajax php】複数選択したファイルを別々のフォルダにアップする方法

Hmurakami

総合スコア15

PHP

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

0グッド

0クリップ

投稿2018/10/04 02:36

ajaxでファイルのアップロードシステムを作っています。

1ファイルずつをフォルダ分けしてアップロードすることはできています。

例えばこのような感じです。

aファイルを選択、アップロードボタンクリック、Aフォルダへアップロード 完了
次に
bファイルを選択、アップロードボタンクリック、Bフォルダへアップロード 完了

これを

aファイル選択、bファイル選択、1つのアップロードボタンクリックでaファイルはAフォルダへ、bファイルはBフォルダへアップしたいと思っています。

ajaxをループで回すなども考えたのですがうまく考えがまとまりません。

実現するために考えられる方法をご教示いただければと思います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どのフォルダにアップされるかはサーバー側の仕様ですから
適当な目印を一緒におくってあげてそれを使って
サーバーサイドで振り分ければいいでしょう

formが別れている場合

formのatcionで処理を分ける

  • x.html

html

1<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 $('#btn').on('click',function(){ 5 $('[type=file]').each(function(){; 6 var fd = new FormData(); 7 var name=$(this).attr('name'); 8 var action=$(this).closest('form').attr('action'); 9 var file=$(this).prop('files')[0]; 10 var fr = new FileReader(); 11 fr.addEventListener("load", function(e){ 12 fd.append(name, new Blob([e.target.result],{"type":file.type}),file.name ); 13 $.ajax({ 14 "url":action, 15 "type":"post", 16 "data":fd, 17 "cache":false, 18 "processData": false, 19 "contentType": false, 20 }).done(function(data){ 21 console.log(data); 22 }); 23 }); 24 fr.readAsArrayBuffer(file); 25 }); 26 }); 27}); 28</script> 29<form method="post" action="y.php" enctype="multmultipart/form-data"> 30<input type="file" name="a"><br> 31</form> 32<form method="post" action="z.php" enctype="multmultipart/form-data"> 33<input type="file" name="b"><br> 34</form> 35<input type="button" value="send" id="btn"><br>
  • y.php

PHP

1<?PHP 2print_r($_FILES);
  • z.php

PHP

1<?PHP 2print_r($_FILES);

一つのformから

  • x.html

HTML

1<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 $('#btn').on('click',function(){ 5 var fd = new FormData(); 6 var defs=[]; 7 $(this).closest('form').find('[type=file]').each(function(){; 8 var name=$(this).attr('name'); 9 var def=$.Deferred(); 10 var file=$(this).prop('files')[0]; 11 var fr = new FileReader(); 12 fr.addEventListener("load", function(e){ 13 fd.append(name, new Blob([e.target.result],{"type":file.type}),file.name ); 14 return def.resolve(); 15 }); 16 fr.readAsArrayBuffer(file); 17 defs.push(def.promise()); 18 }); 19 $.when.apply(null,defs).then(function(){ 20 $.ajax({ 21 "url":"y.php", //とりあえず決め打ち 22 "type":"post", 23 "data":fd, 24 "cache":false, 25 "processData": false, 26 "contentType": false, 27 }).done(function(data){ 28 console.log(data); 29 }); 30 }); 31 }); 32}); 33</script> 34<form method="post"> 35<input type="file" name="a"><br> 36<input type="file" name="b"><br> 37<input type="button" value="send" id="btn"><br> 38</form>
  • y.php

PHP

1<?PHP 2print_r($_FILES);

投稿2018/10/04 02:47

編集2018/10/04 03:59
yambejp

総合スコア114863

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

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

Hmurakami

2018/10/04 03:38 編集

今は form→ajax→php これは問題ありません。 ※formでフォルダ名になる要素を持たせています。 複数のformがありまして。 ボタンを1つ押します。 そうすると formの数だけform→ajax→phpを繰り返してくれれば良いのですが・・・。
yambejp

2018/10/04 03:42 編集

複数のformがあって、それぞれが送り先が違うということですか? であれば繰り返し処理ですね 一つのformにtype=fileが複数あるならなにかフォルダをわけるための キーが必要になります
yambejp

2018/10/04 04:01

一応2種類サンプルあげておきました aでおくられてくるか、bでおくられてくるかで判断できそうな気がしますね
Hmurakami

2018/10/04 04:46

ありがとうございます! 大変参考になりました! 先に記述していただいたformが分かれているバージョンがほぼ近いカタチです。 やはりactionで分けるしか無いのでしょうか? formの数は任意なのでy.phpやz.phpの準備の方法を考えれば行けそうです。
yambejp

2018/10/04 04:59

actionを参照したのはformが別れている場合手っ取り早いからです 飛び先は任意にリストをつくっておいて参照すれば大丈夫です
guest

0

質問の内容からは、つまづいている箇所がjavascript部分(クライアントサイド)か、php部分(サーバサイド)か、読み取れませんでした。

jqueryを使ってよければ、
jQuery-File-Upload
を使用するのはいかがでしょうか。リンク先にphpのサーバサイドのサンプルもあります。

投稿2018/10/04 02:56

編集2018/10/04 03:10
EuphoryX1

総合スコア25

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

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

Hmurakami

2018/10/04 03:08

仕組みとしてアップロードはできております。 ajax部分とかphp部分とかではなくて 1つのボタンをクリックするとformの内容をajaxで受けてphpにpostをformの数だけループさせたいのです。
EuphoryX1

2018/10/04 03:15

formの数だけ ということは、aファイル、bファイル それぞれに<form>(aファイル選択)(ボタン)</form>が存在しておりますでしょうか。これを<form>(aファイル選択)(bファイル選択)(ボタン)</form>のようにまとめることは可能でしょうか。
Hmurakami

2018/10/04 03:22

<form>(aファイル選択)(bファイル選択)(ボタン)</form> にすることで実現可能であればそれでも大丈夫でございます。
EuphoryX1

2018/10/04 03:39

https://code.i-harness.com/ja/q/1266e02 が参考になると思います。<form enctype="multipart/form-data" method="post">を指定しています。これが複数ファイルには必要です。リンク先ではファイル追加ボタンで <input name="file[]" type="file" />を動的に追加していますが、ここが固定(a,b各inputタグ)になり、"ajaxアップロード用"を参考にFormDataに複数ファイルをappendするようなjavascriptを作成、$.ajaxでphpにpostする。 post先ではfor($i=0; $i<count($_FILES['file']['name']); $i++){でループさせて、a,bファイルに対応したディレクトリに配置する。 このように実装できるかと思います。 a,bファイルに対応したディレクトリ は、連想配列で対応表を作っておくとよいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問