Ожидание окончания загрузки файла (jQuery)

Sanu0074
На сайте с 31.08.2012
Offline
110
1388

Здравствуйте. Вот у меня такая задача, пишу jQuery плагин, внутри которого есть загрузка файлов, такая последовательность действий, извлекаются все поля type=file, далее перебирается все, если есть атрибут multiple у текущего - то все что в нем отправляется по очереди и так до конца перебора всех полей. Мне необходимо заставить скрипт ждать пока закончится отправку текущего файла и перейти к след итерации перебора (each). Вот то что я написал:

var sel = $('.file');

if(sel.length>0){
console.log('Saved files, total fields: '+sel.length);


function sendFile(fd){
$.element.stateUpload = true;

$.ajax({
type: 'POST',
url: HOST+'/uploadFile',
data: fd,
processData: false,
contentType: false,
success: function(data) {
$.element.stateUpload = false;
console.log(data);

},
error: function(data) {
$.element.stateUpload = false;
console.log(data);

}
});
}


$.each(sel,function(){ //отправка всех файлов по очереди даже если multiple - то по одному

var fd = new FormData();
fd.append('elementID', data.elementID);
fd.append('type',$(this).data('file'));
var file = $(this)[0].files[0];
if($(this).hasAttr('multiple')){
var input = document.querySelector('[data-file="'+$(this).data('file')+'"]').files;
for (var i = 0; i < input.length; i++){
fd.append('file',input);
sendFile(fd);
}
}else{
fd.append('file', file);
sendFile(fd);
}

});

Тут еще неплохо было бы выдать alert(), после окончания загрузки всех файлов из очереди. Я лепил интервалы, ничего толкового не вышло, помогите разобраться!

lutskboy
На сайте с 22.11.2013
Offline
192
#1

А готовый не подойдет?

http://danielm.herokuapp.com/demos/dnd/

или там подсмотрите реализацию.

Sanu0074
На сайте с 31.08.2012
Offline
110
#2

lutskboy, нет, не подойдет. Я думаю надо правильно интервал написать и все ок будет

Sanu0074
На сайте с 31.08.2012
Offline
110
#3

вот я набодяжил решение, главное работает)

if(sel.length>0){

console.log('Saved files, total fields: '+sel.length);


function sendFile(fd){
$.element.stateUpload = true;

$.ajax({
type: 'POST',
url: HOST+'element/uploadFile',
data: fd,
processData: false,
contentType: false,
success: function(data) {
$.element.stateUpload = false;
console.log(data);

},
error: function(data) {
$.element.stateUpload = false;
console.log(data);

}
});
}

var obFD = [];

$.each(sel,function(){
var fd = new FormData();
fd.append('elementID', data.elementID);
fd.append('type',$(this).data('file'));
var file = $(this)[0].files[0];
if($(this).hasAttr('multiple')){
var input = document.querySelector('[data-file="'+$(this).data('file')+'"]').files;
for (var i = 0; i < input.length; i++){
var fd = new FormData();
fd.append('elementID', data.elementID);
fd.append('type',$(this).data('file'));
fd.append('file',input);
obFD.push(fd);
}
}else{
fd.append('file', file);
obFD.push(fd);
}
});

var i = 0;
var t = setInterval(function(){
if(!$.element.stateUpload){
sendFile(obFD);
i++;
}
if(i==obFD.length){
clearInterval(t);
$.wnd.close(true);
$.sysMsg.showOk(data.msg);
return;
}
},1000);

return;
}
siv1987
На сайте с 02.04.2009
Offline
427
#4
Sanu0074
На сайте с 31.08.2012
Offline
110
#5

siv1987, в таком случает висит страница, особенно если файлы большие

siv1987
На сайте с 02.04.2009
Offline
427
#6
Sanu0074:
Мне необходимо заставить скрипт ждать пока закончится отправку текущего файла

В каком случае тогда не висит страница, пока скрипт ждет полную загрузку текущего файла?...

Sanu0074
На сайте с 31.08.2012
Offline
110
#7

siv1987, но при этом должна продолжать жить страница, иначе какой смысл делать ajax запрос?

siv1987
На сайте с 02.04.2009
Offline
427
#8

делайте тогда асинхронный запрос, и вызывайте рекурсивно функцию по окончания загрузки.

Sanu0074
На сайте с 31.08.2012
Offline
110
#9

siv1987, а то что я написал с интервалом, очень плохо?

siv1987
На сайте с 02.04.2009
Offline
427
#10

Имхо, костыль.


var _index = 0;

function sendFiles(obFD){
var fd = obFD[_index];
if(fd){
_index++;
$.ajax({
success: function(data) {
sendFiles(obFD);
},
});
}
else{
//Finish
}
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий