在一个请求中上传多个文件 Dropzone 发送两个请求

Posted

技术标签:

【中文标题】在一个请求中上传多个文件 Dropzone 发送两个请求【英文标题】:upload multiple files in one request Dropzone sending two requests 【发布时间】:2015-03-17 07:15:26 【问题描述】:

我正在尝试使用 DropZone js 在一个请求中发送多个文件。

这是我的代码:

Dropzone.autoDiscover = false;

var myDropzone = new Dropzone('#upload-Invoices',        
    paramName: "files", 
    maxFilesize: 3.0, 
    maxFiles: 4,
    parallelUploads: 10000,
    uploadMultiple: true,
    autoProcessQueue: false
);

$('#btnUpload').on('click', function () 
    myDropzone.processQueue();
);

控制器:

public void FileUpload( IEnumerable<HttpPostedFileBase> file )

    // Do Something

查看:

<form action="/Index/FileUpload"
      class="dropzone"
      id="upload-Invoices" data-ajax-method="POST" data-ajax="true">
    <input type="submit" value="Upload File to Server" id="btnUpload">
</form>

虽然在不同的请求中正在接收文件,但我想在一个请求中发送所有文件,Dropzone 页面有一个选项,尽管它不起作用。 提前致谢

【问题讨论】:

【参考方案1】:

你可以使用uploadMultiple属性默认值false改成true

$(".dropzone").dropzone(
            // autoQueue:false,
            parallelUploads:10,
            uploadMultiple:true,

https://www.dropzonejs.com/#config-uploadMultiple

【讨论】:

“你可以使用uploadMultiple属性”...问题中的示例代码已经有uploadMultiple: true【参考方案2】:

问题是我正在使用输入 type="submit",它会自行发布另一篇文章,将其更改为输入 button 有效。

【讨论】:

奇怪我有完全相同的问题,但输入 type=button 并没有为我解决这个问题。我必须添加 parallelUploads: 10 才能让它工作,因为 paralledUploads 默认只有 2 个文件。【参考方案3】:

遇到同样的问题,只需将 autoDiscover: false,添加到您的 dropzone 选项,它应该可以工作!

我的选择是这样的:

Dropzone.options.UploadZone =         
    addRemoveLinks: true,
    autoDiscover: false,
    uploadMultiple: true,
    parallelUploads: 10,
    maxFiles: 10,
    acceptedFiles: ".jpeg,.jpg,.png",
    autoProcessQueue: false,
    ...

使用 autoProcessQueue: false 和 uploadMultiple: true: 对于每 2 个文件,我都会收到一个请求。

然后我添加了 parallelUploads: 10 和 maxFiles: 10,我不知道为什么,但我的前 2 个文件在我将它们放在 dropzone 上后立即开始上传,即使使用 autoProcessQueue: false。

然后我只添加 autoDiscover: false 并且一切正常!

好看!

【讨论】:

【参考方案4】:

我还看到一次发送 2 个文件的多个 POST(例如,总共 4 个文件的 2 个单独的 POST)。

我找到了解决方案here:增加parallelUploads。我现在通过以下方式创建 dropzone:

var myDropzone = new Dropzone('div#dz', 
  url: 'http://httpbin.org/post',
  uploadMultiple: true,
  parallelUploads: 10
);

【讨论】:

设置maxFiles: 10 可能也不错,这样用户就不会超出您的并行限制并触发另一个 HTTP 请求。【参考方案5】:

enqueueForUpload 属性已弃用,您应该改用autoProcessQueue。我的预感是,由于不再使用enqueueForUpload 并且您没有将autoProcessQueue 设置为false,DropZone.js 假定您要发送每个文件,因为它被放置在组件上。

您应该删除enqueueForUpload: false,设置autoProcessQueue: false,并在选择(即删除)您需要上传的所有文件后,调用.processQueue() 函数,如documentation 中所述。

【讨论】:

这真的很奇怪。抱歉,我没有更多的想法。 但是,一个帖子中有文件,第二个请求没有。 您也在发布表格吗?我不是 DropZone.js 专家,但可能是 processQueue() 函数发布了表单。还有一件事,如果你在表单上设置enctype="multipart/form-data"会发生什么? 它是某种类型的编码,在处理上传时是必需的 这是在 ASP.MVC 中上传文件的标准方式。这就是为什么我问你是否尝试设置正确的enctype【参考方案6】:

我可以看到这是很老的帖子,但是,我会回答希望它可能对某人有所帮助。

2 个请求

    选项 - 无文件 POST - 带文件

Chrome 会执行 pre-flight request(OPTIONS) 来查找 CORS 标头。这是几乎所有最新浏览器都遵循的标准。

【讨论】:

以上是关于在一个请求中上传多个文件 Dropzone 发送两个请求的主要内容,如果未能解决你的问题,请参考以下文章

Dropzone.JS 在同一个请求中发送文件和表单数据

Dropzone多个文件上传不适用于Excel文件

Dropzone 手动删除上传的文件

autoProcessQueue = false在dropzone.js中不起作用

一种形式的多个放置区

使用 dropzone 和使用 FormValidation 插件的其他表单字段上传多个文件