EF Core 5 上传文件时 FormFile 变量名的约束
最近开发的项目中,后端是用 EF Core 5 开发的。在做文件上传服务的时候,遇到一个奇怪问题。
API Controller 中有个方法是将 Icon 图像文件存放到数据库,方法需要的参数是 IFormFile 类型的文件对象:
[HttpPost]
public async Task<<ActionResult<MiscFile>> PostMiscFile(IFormFile file)
{
// code
}
我发现,参数名如果不是 file
, 而是自己随便取的比如 myFile
, 参数传入的对象就会变成 null
:
只有是 file
时才会有数据:
这是为何,难道变量名不能随便定义吗?
看了一下 Request:
看到其中的 Request.Form.Files[0].Name
是 file
时,我有点悟了。再检查一下我前端的代码:
原来我 formData
中上传文件取的对象名就是 file
, 经过测试,只要这里名字改成 myFile
, 后端的 myFile
就不再是 null ——他们之间有映射关系: 后端 FormFile
的变量名必须和前端提交的 FormData
的文件名保持一致。
以此约束为关键字上网一搜,找到这些资料:
- https://github.com/dotnet/AspNetCore.Docs/issues/7702
- https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-5.0
- https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-5.0#match-name-attribute-value-to-parameter-name-of-post-method
- https://devblog.dymel.pl/2016/09/02/upload-file-image-angular2-aspnetcore/
官方文档说法:
- In non-Razor forms that POST form data or use JavaScript's FormData directly, the name specified in the form's element or FormData must match the name of the parameter in the controller's action.
所以说,文档还是要多看……