我正在尝试使用用于浏览器的aws-sdk.js向亚马逊S3实现一个dropzone.js上传器。但当我超过设置中的'parallelUploads‘最大值时,队列永远不会完成。我正在使用以下链接中的方法:
我的代码的相关部分:
var dz = new Dropzone("#DZContainer", {
acceptedFiles: "image/*,.jpg,.jpeg,.png,.gif",
autoQueue: true,
autoProcessQueue: true,
parallelUploads: 10,
clickable: [".uploadButton"],
accept: function(file, done){
let params = {
"Bucket": "upload-bucket",
"Key": getFullKey(file.name),
Body: file,
Region: "us-east-1,
ContentType: file.type
}
file.s3upload = AWS.S3.ManagedUpload(params);
if (typeof(done) === 'function') done();
},
canceled: function(file) {
if (file.s3upload) file.s3upload.abort();
},
init: function () {
this.on('removedfile', function (file) {
if (file.s3upload) file.s3upload.abort();
});
}
)
dz.uploadFiles = function (files) {
for (var j = 0; j < files.length; j++) {
var file = files[j];
dz.SendFile(file);
}
};
dz.SendFile = function(file) {
file.s3upload.send(function (err, data) {
if (err) {
console.err(err)
dz.emit("error", file, err.message);
} else {
dz.emit("complete", file);
}
});如果我拖入(或使用可单击的) 10个以上的文件,前10个文件将完成,但它永远不会处理队列的其余部分。我遗漏了什么?感谢所有的帮助。
编辑:通过对Dropzone的深入研究,似乎文件状态永远不会被设置为完成。我在dropzone代码中看到了一个名为_finished()的函数,但是我很难弄清楚是什么触发了这个函数。我尝试了下面列出的dz.emit("complete",文件)以及添加dz.emit("success",文件),但_finished()函数第一行的断点从未触发过。因此,file.status永远不会设置为completed。有人知道_finished()应该在什么时候/什么/如何运行吗?
发布于 2020-12-15 04:34:36
正如在编辑中提到的,我能够追踪到.status没有正确设置的地方。这似乎在一个名为_finished()的私有Dropzone函数中。
通过进一步的检查,我注意到在将file.status设置为Dropzone.SUCCESS并发出“成功”之后,_finished()似乎也调用了emit("complete",file)。然后,它检查是否设置了autoProcessQueue,如果设置了,则返回processQueue()调用的结果。
我花了很长时间才弄清楚是什么触发了这个函数,因为它发生在onload事件上,最终意识到绑定到内部上传器使用的XHTTPRequest对象(它正在被S3上传器覆盖)
因此,我修改了该函数,以模拟Dropzone._finished()正在做的事情,并且它的行为符合预期:
dz.SendFile = function(file) {
file.s3upload.send(function (err, data) {
if (err) {
console.err(err)
dz.emit("error", file, err.message);
} else {
file.status = Dropzone.SUCCESS;
dz.emit("success", file, data, err);
dz.emit("complete", file);
if(dz.options.autoProcessQueue)
dz.processQueue()
}
});https://stackoverflow.com/questions/65292486
复制相似问题