This code snippet allows to drop multiple files dragged into a box. The filereader creates a blob of each file and then EACH file should be send to server using the 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);
}
PROBLEM: the server internal crashes when receiving a next blob while not having processed the former one.
I found another Post discussing this: How to make all AJAX calls sequential? A "sequential" Request using async:false is not an option, it would block a whole lot of other things..
SOLUTION: ??? Call ajax forfile1, when call is done, call ajax for file2, ...call ajax for file-n
I would really like to use JQ Deferred (http://api.jquery.com/category/deferred-object/) e.g. as described here: http://api.jquery.com/jQuery.when/
$.when($.ajax(???h开发者_JAVA百科ow to refer to THIS ajax call).done(function(){
//call this ajax for the next file again or use $.ajax(code).then()?
});
I am really sorry, but I do not know how to get it right.
Thanks for any suggestions! h.
Well there is a plugin the queue plugin:
http://plugins.jquery.com/project/ajaxqueue
It's written by John Resig himself.
you can certainly queue them without a plugin by resolving with the next promise
$.ajax(/*options*/)
.then(function(res) {
// do something with result
// call 2
return $.ajax(/* options */);
})
.then(function(res) {
// call 3
return $.ajax(/* options */);
}) // and so on
.fail(function(err) {
// catch any error from any ajax call
});
this is almost the same thing as nesting the callbacks with the added benefit of readability and the catch all for errors
精彩评论