首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dropzone.js + AWS S3停止队列

问Dropzone.js + AWS S3停止队列
EN

Stack Overflow用户
提问于 2020-12-15 00:17:18
回答 1查看 99关注 0票数 0

我正在尝试使用用于浏览器的aws-sdk.js向亚马逊S3实现一个dropzone.js上传器。但当我超过设置中的'parallelUploads‘最大值时,队列永远不会完成。我正在使用以下链接中的方法:

amazon upload

我的代码的相关部分:

代码语言:javascript
复制
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()应该在什么时候/什么/如何运行吗?

EN

回答 1

Stack Overflow用户

发布于 2020-12-15 04:34:36

正如在编辑中提到的,我能够追踪到.status没有正确设置的地方。这似乎在一个名为_finished()的私有Dropzone函数中。

通过进一步的检查,我注意到在将file.status设置为Dropzone.SUCCESS并发出“成功”之后,_finished()似乎也调用了emit("complete",file)。然后,它检查是否设置了autoProcessQueue,如果设置了,则返回processQueue()调用的结果。

我花了很长时间才弄清楚是什么触发了这个函数,因为它发生在onload事件上,最终意识到绑定到内部上传器使用的XHTTPRequest对象(它正在被S3上传器覆盖)

因此,我修改了该函数,以模拟Dropzone._finished()正在做的事情,并且它的行为符合预期:

代码语言:javascript
复制
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()
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65292486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档