このコード スニペットを使用すると、ボックスにドラッグした複数のファイルをドロップできます。ファイルリーダーは各ファイルの BLOB を作成し、各ファイルは ajax rq を使用してサーバーに送信する必要があります。
$.each( e.dataTransfer.files, function(index, file){
var fileReader = new FileReader();
//..generate BLOB from file
fileReader.onloadend = (function(file) {
return function(e) {
uploadfilelist.append('<li>' + file.fileName + '</li>');
//send every single file to server
var destfoldername=CURRENTPATH;
var uploadfilename=file.fileName;
var fd = new FormData();
fd.append("param1", destfoldername);
fd.append("param2", uploadfilename);
fd.append("param3", blob);
$.ajax({
type:"POST",
url:"url",
data:fd,
contentType: false,
processData: false,
beforeSend:function (xhr){
//custom headers
},
success: function(data, textStatus, jqXHR){
},
complete: function(jqXHR){
alert("State after complete: " + jqXHR.statusText);
}
});
};
})(file);
fileReader.readAsBinaryString(file);
}
問題: 前の BLOB を処理していないときに次の BLOB を受信すると、サーバーの内部がクラッシュします。
これについて議論している別の投稿を見つけました:すべての AJAX 呼び出しを順次にする方法は? async:false を使用した「シーケンシャル」リクエストはオプションではなく、他の多くのものをブロックします..
解決: ???file1 に対して ajax を呼び出し、呼び出しが完了したら、file2 に対して ajax を呼び出し、...file-n に対して ajax を呼び出します
ここで説明されているように、JQ Deferred ( http://api.jquery.com/category/deferred-object/ )を使用したいと思います: http://api.jquery.com/jQuery.when/
$.when($.ajax(???how to refer to THIS ajax call).done(function(){
//call this ajax for the next file again or use $.ajax(code).then()?
});
大変申し訳ありませんが、正しい方法がわかりません。
ご提案ありがとうございます。h.