当输入名称为file []时,绑定到IFormFile无效。 Dropzone + .Net Core Web API

时间:2019-06-05 13:15:33

标签: c# .net-core dropzone

我正在尝试使用dropzone和使用.Net Core的Web API上载每个请求的许多文件。

为此,我们必须配置Dropzone以使用uploadMultiple选项在一个请求中发送许多文件。默认情况下,dropzone每个请求发送一个文件。如果要上传10个文件,它将发出10个请求。我不要。

当uploadMultiple设置为true时,dropzone将在输入名称后附加一个[]。例如,假设输入的名称是“文件”。当uploadMultiple为true时,它将变为Files []。

要读取.Net Core Web API中的文件,我们只需要创建一个控制器即可接收来自表单的IList读数。像这样:

public ActionResult<MyResponse> Upload([FromForm] IList<IFormFile> Files)

问题

问题是名称中的[]。 Dropzone以以下名称发送文件:

文件[0], 文件[1] ...文件[N]

然后,.Net Core中的绑定失败,因为它希望名称为File。我试图将绑定名称更改为:

public ActionResult<MyResponse> Upload([FromForm(Name = "Files[]")] IList<IFormFile> Files)

但是这当时不起作用。当我更改为:

public ActionResult<MyResponse> Upload([FromForm(Name = "Files[0]")] IList<IFormFile> Files)

它适用于文件数组的第一个条目。

所以我正在寻找一种方法,使Dropzone发送的名称模式“ File [any_number]”绑定到.Net Core Web API的IList中。

有什么办法可以实现?

到目前为止,要解决此问题,我直接从请求中读取文件。像这样:

var files = HttpContext.Request.Form.Files;

但是我更喜欢使用绑定方式。

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经找到了解决方案。

似乎[FromForm(Name =“ File”)]仅可以接收文字字符串,而不能接收模式。因此,Web API端无需执行任何操作。

但是我们可以通过从输入名称中删除[]来更改dropzone发送文件的方式。由于这个问题:

https://github.com/enyo/dropzone/issues/901

有一个隐藏的功能(未记录),它使我们可以将函数而不是字符串传递给paramName选项。通过这样做,我们覆盖了在文件名中添加多个[]的dropzone行为。

文件发送像往常一样,绑定自然进行。