【问题标题】:Uploading multiple files asynchronously by blueimp jquery-fileupload通过 blueimp jquery-fileupload 异步上传多个文件
【发布时间】:2013-11-17 09:52:29
【问题描述】:

我正在使用 jQuery File Upload 库 (http://github.com/blueimp/jQuery-File-Upload),我一直在搞清楚如何使用满足以下条件的库。

  • 该页面有多个由表单标签包围的文件输入字段。
  • 用户可以将多个文件附加到每个输入字段
  • 当点击按钮时,所有文件都会发送到服务器,而不是当文件附加到输入字段时。
  • 上传是异步完成的
  • 假设页面有 3 个输入字段,其名称属性分别为“file1[]”、“file2[]”和“file3[]”,请求有效负载应类似于 {file1: [file1[] 上的文件数组] ], file2: [file2[] 上的文件数组], ...}

这是 jsFiddle,到目前为止它的行为很奇怪,因为它发送了两次 post 请求,第一个被取消了。

更新

现在感谢@CBroe 的评论,请求被发送两次的问题得到了解决。但是请求参数的键没有正确设置。 这是更新的 jsFiddle。

http://jsfiddle.net/BAQtG/27/


js代码的核心部分是这样的。

$(document).ready(function(){
    var filesList = []
    var elem = $("form")
    file_upload = elem.fileupload({
        formData:{extra:1},
        autoUpload: false,
        fileInput: $("input:file"),
    }).on("fileuploadadd", function(e, data){
        filesList.push(data.files[0])
    });

    $("button").click(function(){
        file_upload.fileupload('send', {files:filesList} )
    })

})

有人知道如何让它工作吗?

【问题讨论】:

    标签: javascript jquery file-upload jquery-file-upload form-data


    【解决方案1】:

    解决了。

    小提琴: http://jsfiddle.net/BAQtG/29/

    还有js代码

    $(document).ready(function(){
        var filesList = [],
            paramNames = [],
            elem = $("form");
        file_upload = elem.fileupload({
            formData:{extra:1},
            autoUpload: false,
            fileInput: $("input:file"),
        }).on("fileuploadadd", function(e, data){
            filesList.push(data.files[0]);
            paramNames.push(e.delegatedEvent.target.name);
        });
    
        $("button").click(function(e){
            e.preventDefault();
            file_upload.fileupload('send', {files:filesList, paramName: paramNames});
        })
    })
    

    【讨论】:

    • jsfiddle 代码实际上并未将文件本身附加到 POST。 (它是 application/x-www-form-encoded,而不是 mulitpart)关于示例中缺少什么的任何建议?
    【解决方案2】:

    您的脚本触发的第一个 POST 请求被取消,因为按钮提交表单(导致第二个 POST 请求)。

    如果您希望它具有提交功能,请在button 上使用type="button"

    【讨论】:

    • 感谢您的评论,这是问题的一部分!现在剩下的问题是如何使用库发送具有多个密钥的文件。
    【解决方案3】:

    您必须添加return false;,如下所示:

    $("button").click(function(){
        file_upload.fileupload('send', {files:filesList} )
        return false;
    })
    

    或指定type="button"属性:

    <button type="button">send by fileupload send api</button>
    

    要设置formData,请使用以下命令:

    $("button").click(function () {
        file_upload.fileupload('send', {
            files: filesList,
            formData: {
                json: JSON.encode({
                    extra: 1
                })
            }
        })
    })
    

    专门针对JSFiddle,如果你想在响应中获取extra值,你必须对其进行编码并将其分配给一个名为json的属性。

    Here 是一个工作示例。

    【讨论】:

    • 谢谢你。如上所述,请求参数的键仍然没有正确设置。
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2019-01-26
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多