プログレス コールバックがどのファイルに対するものであるかをどのように知ることができますか?
IE10 のみ (Chrome/FireFox/Safari 以外) で sequentialUploads を true に設定しても、同時にアップロードする複数のファイルを選択すると、add コールバックの data.files 配列に複数のファイルが含まれます。他のすべてのブラウザーでは、add コールバックはファイルごとに 1 回呼び出され、配列は常に 1 つのファイルになります。
したがって、add コールバックで各ファイルを処理するために for ループを実行しますが、問題ありません。
ただし、現在、進行状況のコールバックを更新していますが、進行状況がどのファイルに対するものであるかを知る方法はありません。コールバックは "e" と "data" の 2 つのパラメーターを取得し、データ オブジェクトが読み込まれ、進行状況を示す合計値が表示されます...しかし、どのファイルに対してですか? 一部の処理コールバックには、それがどのファイルであるかを示す 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));
}
});
}