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

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

新規登録して質問してみよう
ただいま回答率
85.47%
アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

2038閲覧

jQuery when()を使用して、複数のファイルアップロードを並列処理

akira_hh

総合スコア10

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/10/16 16:21

前提・実現したいこと

Webブラウザから複数選択した画像と動画をサーバーへアップロードする機能を作成しています。

複数選択された画像、動画をajaxで1件ずつサーバーへアップロードし、サーバー側でサムネイルを作成してファイル名をブラウザへ返す仕様を考えています。

ローディングアニメーションを表示したいので、ajaxの処理の前にアニメーションを表示し、ajaxの処理の後にアニメーションを非表示にしたいです。

記載したソースコードのように実装した場合に、POSTされたファイルが空になってしまう問題が起きてしまいました。

原因と解決方法をご教授いただけると助かります。

よろしくお願いいたします。

発生している問題・エラーメッセージ

POSTされたファイルが空になる

該当のソースコード

js

1 $('input[name=files\[\]]').change(function(){ 2 $('.loading').show(); 3 4 $.when.apply($, 5 $($(this).prop('files')).map(function(){ 6 uploadFile($(this)); 7 }) 8 ).done(function(){ 9 $('.loading').hide(); 10 }).fail(function(){ 11 $('.loading').hide(); 12 alert('通信エラー\nお手数ですが再度時間をおいてお試しください。'); 13 }); 14 }); 15 16 function uploadFile(file){ 17 let fd = new FormData(); 18 fd.append("upfile", file); 19 20 $.ajax({ 21 type : 'POST', 22 enctype : 'multipart/form-data', 23 dataType : 'json', 24 url : './uploadapi/upload.json', 25 data : fd, 26 processData : false, 27 contentType : false, 28 cache : false, 29 success : function(res) 30 { 31 if(res.error){ 32 alert('アップロード失敗:' + res.error); 33 }else{ 34 $('.thumb_area').append('<img src="/assets/img/thumb/' + res.filename + '">'); 35 } 36 } 37 }); 38 }

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

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

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

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

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

guest

回答2

0

whenするまでもないと思いますが

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 document.querySelector('#f').addEventListener('change',async (e)=>{ 4 const debug=document.querySelector('#debug'); 5 const url="send.php"; 6 const method="post"; 7 const body=new FormData(e.target.form); 8 debug.textContent="show"; 9 await fetch(url,{method,body}).then(res=>res.text()).then(console.log); 10 debug.textContent="hide"; 11 }); 12}); 13 14</script> 15<form> 16<input type="file" name="file[]" id="f" multiple> 17</form> 18<div id="debug"></div>

//send.php

PHP

1<?PHP 2sleep(3); 3print_r($_FILES);

投稿2020/10/17 14:44

yambejp

総合スコア114968

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

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

akira_hh

2020/10/18 11:22

ご回答ありがとうございます。 ご教示していただいた方法ですと複数選択されたファイルをまとめてサーバーへ送信すると思いますが 今回選択される画像や動画の数が多くなる可能性があり、1件ずつサーバーへ送信して処理したいと考えています。
yambejp

2020/10/18 11:40

Changeイベントで送信するのにmulpipleで送る以外 どういうUIを想定しているのでしょうか?
akira_hh

2020/10/19 13:53

UIはmultipleで複数選択を行い、選択が完了したタイミング(Changeイベントの発火)で選択されたファイルを1件ずつ別のリクエストでサーバーへ送信したいと考えています。
akira_hh

2020/10/19 15:44

上手く意図をお伝えできず、申し訳ありませんでした。 なんとか自己解決できましたのでクローズにしたいと思います。 ご回答ありがとうございました。
yambejp

2020/10/20 00:39

個別に送るとこうですが、これが効率的かといわれると疑問が残ります。 <script> window.addEventListener('DOMContentLoaded', ()=>{ document.querySelector('#f').addEventListener('change',async (e)=>{ const debug=document.querySelector('#debug'); const url="y.php"; const method="post"; debug.textContent="show"; var ff=[...e.target.files].map(x=>{ console.log(1); var body=new FormData(); body.append(e.target.name,x); return new Promise(resolve=>fetch(url,{method,body}).then(res=>res.text()).then(txt=>resolve(txt))); }); Promise.all(ff).then(res=>{ console.log(...res); debug.textContent="hide"; }); }); }); </script> <form> <input type="file" name="file[]" id="f" multiple> </form> <div id="debug"></div>
guest

0

自己解決

初歩的なミスでした。。
アップロード用関数の引数を$(this)ではなく、変数に代入したものを渡すことでサーバーへファイルを送信することができました。
あとajaxオブジェクトをreturnしていなかった箇所を修正しました。

js

1$('input[name=files\[\]]').change(function(){ 2 $('.loading').show(); 3 4 $.when.apply($, 5 $($(this).prop('files')).map(function(i, file){ 6 // $(this)ではなく、変数に代入して渡す 7 // uploadFileの返り値(ajaxのオブジェクト)をリターン 8 return uploadFile(file); 9 }) 10 ).done(function(){ 11 $('.loading').hide(); 12 }).fail(function(){ 13 $('.loading').hide(); 14 alert('通信エラー\nお手数ですが再度時間をおいてお試しください。'); 15 }); 16 }); 17 18 function uploadFile(file){ 19 let fd = new FormData(); 20 fd.append("upfile", file); 21 // ajaxオブジェクトをリターン 22 return $.ajax({ 23 type : 'POST', 24 enctype : 'multipart/form-data', 25 dataType : 'json', 26 url : './uploadapi/upload.json', 27 data : fd, 28 processData : false, 29 contentType : false, 30 cache : false, 31 success : function(res) 32 { 33 if(res.error){ 34 alert('アップロード失敗:' + res.error); 35 }else{ 36 $('.thumb_area').append('<img src="/assets/img/thumb/' + res.filename + '">'); 37 } 38 } 39 }); 40 }

投稿2020/10/19 15:44

akira_hh

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問