Javascript Blueimp文件上传-直接多次上传到S3

Javascript Blueimp文件上传-直接多次上传到S3,javascript,jquery,file-upload,amazon-s3,blueimp,Javascript,Jquery,File Upload,Amazon S3,Blueimp,在搜索了过去几天之后,我发现有将近30个不同的人在问同样的问题,但我没有找到答案。一对夫妇报告说他们找到了解决方案,但没有提供,所以我希望有人能在这里回答 使用,如何将多个文件直接上传到Amazon S3 问题:S3每个请求只接受一个文件 解决方案:用于为每个文件发送单独的请求 路障:我不知道该怎么做 解决方案尝试 指南如下: S3目前需要的表单字段比指南中显示的表单字段更多。以下是我的代码的精简版本: $(':file').each(function(i, el) { var f

在搜索了过去几天之后,我发现有将近30个不同的人在问同样的问题,但我没有找到答案。一对夫妇报告说他们找到了解决方案,但没有提供,所以我希望有人能在这里回答


使用,如何将多个文件直接上传到Amazon S3

问题:S3每个请求只接受一个文件

解决方案:用于为每个文件发送单独的请求

路障:我不知道该怎么做


解决方案尝试 指南如下:

S3目前需要的表单字段比指南中显示的表单字段更多。以下是我的代码的精简版本:

$(':file').each(function(i, el) {

    var fileInput = $(el);
    var form = fileInput.parents('form:first');

    fileInput.fileupload({
        forceIframeTransport: true,
        autoUpload: true,
        singleFileUploads: true, //default anyway
        add: function(event, data) {
            var files = data.files || [];
            var nextInQueue = files[0]; //this is a queue, not a list
            console.log('nextInQueue:', nextInQueue);
            if (!nextInQueue) return;

            var fileData = {name: nextInQueue.name, mime: nextInQueue.type, size: nextInQueue.size};

            $.ajax({
                url: '/s3stuff',
                type: 'POST',
                dataType: 'json',
                data: {'file': fileData},
                async: false,
                success: function(res) {
                    form.find('input[name="key"]').val(res.key);
                    form.find('input[name="AWSAccessKeyId"]').val(res.AWSAccessKeyId);
                    form.find('input[name="policy"]').val(res.policy);
                    form.find('input[name="signature"]').val(res.signature);
                    form.find('input[name="acl"]').val(res.acl);
                    form.find('input[name="success_action_status"]').val(res.success_action_status);
                    form.find('input[name="Content-Type"]').val(nextInQueue.type);
                    form.attr('action', res.url);

                    data.submit(); //why is this submitting all files at once?
                }
            });
        },
        fail: function(err) {
            console.log('err:', err.stack);
        }
    });
});

错误 当我尝试上传一个文件时,效果非常好!但当我尝试上载多个文件时,S3返回以下
400
错误:


无效辩论
POST要求每个请求只上载一个文件。
这样说(在
添加
下):

如果启用了singleFileUploads选项(这是默认设置),则会为XHR文件上载选择中的每个文件调用一次添加回调,data.files数组长度为1,因为每个文件都是单独上载的

这就是我被困的地方:
如果
“每个文件都单独上传”
到S3,为什么S3会这样说?

此外,无论文件数量多少,
add
函数只运行一次。(我用
console.log
语句验证了这一点。)我认为这可能有两个原因:

  • 插件在一次提交失败后停止进一步提交
  • 插件没有单独提交文件(无论出于何种原因)

  • 我的代码是否不正确,插件中是否缺少一个选项,或者插件是否不支持多次直接上传到S3


    更新 下面是一个用于快速测试的html文件:

    JQuery文件的作者上传到这里

    文件未单独提交的原因是
    forceIframeTransport
    选项,在您的示例中,该选项设置为
    true

    缔约国声明如下:

    默认情况下,对于XHR类型的上载,使用单个请求上载选择的每个文件

    缔约国指出:

    将此选项设置为
    true
    以强制iframe传输上载,即使浏览器能够上载XHR文件

    因此,解决方案是启用
    forceIframeTransport
    选项

    顺便说一下,大多数集成示例都是用户贡献(包括S3上传指南)。 下面是另一个使用S3 CORS功能的,可能会帮助您解决问题(但尚未测试):

    你找到这个问题的答案了吗?不幸的是,没有。我们只需要禁用多个文件上载。好的,不用担心,我已经开始在这个问题上悬赏,因为我的需求必须支持多个文件上载,你已经准确地描述了我的问题。希望我们都能得到答案。使用文件上传插件是要求的一部分吗?看起来您已经放置了
    data.submit()//为什么要一次提交所有文件?
    在成功回电中感谢您对电子邮件Sebastian.Greenracoon23的及时详细回复。您能检查并确认解决方案吗?它有效!谢谢具体来说,它是
    公司规则。顺便说一句,你的插件棒极了。好消息@greenracoon23-很高兴听到这个长期存在的问题现在有了解决方案。我已将赏金授予Seb。您不也必须设置
    限制多文件上传:1
    ?否则,我仍然只看到一个post请求。