Загрузка файла Blueimp, как узнать, для какого файла предназначен обратный вызов хода выполнения?
Как узнать, для какого файла предназначен обратный вызов прогресса?
Несмотря на то, что я установил для sequentialUploads значение true, только в IE10 (не Chrome/FireFox/Safari), когда я выбираю несколько файлов для загрузки одновременно, массив data.files в обратном вызове add содержит несколько файлов. Во всех других браузерах обратный вызов add вызывается один раз для каждого файла, а массив всегда представляет собой всего один файл.
Поэтому я делаю цикл for для обработки каждого файла в обратном вызове add, нет проблем.
Тем не менее, сейчас я обновляю обратный вызов хода выполнения и не вижу способа узнать, для какого файла предназначен прогресс. Обратный вызов получает 2 параметра, "e" и "data", а объект данных уже загружен и итоговые значения, которые дают мне прогресс... но для какого файла? У некоторых из обратных вызовов обработки есть data.index, чтобы сообщить вам, какой это файл, но у процесса загрузки этого нет.
Это просто отсутствующая функция или я что-то упустил?
Мой код сейчас довольно уродлив, потому что я пытаюсь решить эти новые проблемы с IE10. До этого я просто рассчитывал на то, что массив data.files всегда был всего лишь 1 элементом. Вот мой код в любом случае, я постараюсь очистить его, когда у меня будет возможность:
self.initFileUpload = function(elem) {
$(elem).fileupload({
dataType: 'json',
global: false,
sequentialUploads: true,
forceIframeTransport: !!ie,
formData: { hostSID: app.viewModels.main.hostSID() },
done: function(e, data) {
for (var x = 0; x < data.result.files.length; x++) {
var file = data.result.files[x];
var u = file.myObj;
u.sid = file.sid;
console.log("done: " + u.filename);
u.done(true);
}
},
add: function(e, data) {
for (var x = 0; x < data.files.length; x++) {
var file = data.files[x];
var u = [];
u.filename = file.name;
u.size = file.size;
u.perc = ko.observable(0);
u.error = ko.observable("");
u.done = ko.observable(false);
var ext = file.name.split('.').pop().toLowerCase();
u.image = utils.isImageExt(ext);
self.uploads.push(u);
file.myObj = u;
u.jqXHR = data.submit();
}
},
fail: function(e, data) {
for (var x = 0; x < data.result.files.length; x++) {
var file = data.result.files[x];
var u = file.myObj;
if (data.jqXHR && data.jqXHR.responseText)
u.error(data.jqXHR.responseText);
else
u.error("Unknown Error");
console.log("fail: " + u.filename);
}
},
progress: function(e, data) {
console.log(e);
console.log(data);
for (var x = 0; x < data.files.length; x++) {
var file = data.files[x];
console.log(file);
var u = file.myObj;
u.perc(parseInt(file.loaded / file.total * 100, 10));
console.log("perc: " + u.filename + " " + u.perc());
}
},
progressall: function(e, data) {
self.uploadPerc(parseInt(data.loaded / data.total * 100, 10));
}
});
}
0 ответов
Обратный вызов fileuploadprogress включает data.context. Это объект jquery разметки, который вы могли создать в обратном вызове fileuploadadd.
Вы можете добавить элемент прогресса (или любую другую разметку для обеспечения обратной связи) в обратный вызов fileuploadadd, затем найти его снова в fileuploadprogress и установить прогресс:
.on('fileuploadadd', function (e, data) {
$.each(data.files, function (index, file) {
data.context = $('<div/>', { class: 'pull-left text-center media_wrapper' }).appendTo('#thumbnails');
$('<progress>', { value: '0', max: '100'}).appendTo(data.context)
});
})
/* ... */
.on('fileuploadprogress', function (e, data) {
if (data.context) {
var progress = parseInt(data.loaded / data.total * 100, 10);
data.context.find('progress').attr('value', progress);
}
})