从 ASP.NET MVC Web API 中的多个表单数据键接收文件

Posted

技术标签:

【中文标题】从 ASP.NET MVC Web API 中的多个表单数据键接收文件【英文标题】:Receive files from multiple form data keys in ASP.NET MVC Web API 【发布时间】:2021-12-20 01:04:10 【问题描述】:

我正在 ASP.NET MVC (.NET Framework) Web 应用程序中处理 Web API.NET Framework 版本为 4.7.2

我有一个用于文件上传的 Web API(HTTP Post 方法),我使用以下代码检索文件

HttpContext context = HttpContext.Current;
var files = context.Request.Files;
// returns List<HttpPostedFile>

用户可以上传多个文件。上面一行返回了一个文件对象列表,到目前为止我很好。

当我从 Postman 调用 API 时,我准备了如下屏幕截图所示的有效负载。

注意:在 Postman 中,可以在 POST API 请求负载中添加文件(请参阅in here 如何),我正在使用该功能来测试我的 API。

提示说明:请注意,在 Postman 中,我没有为表单数据提供任何密钥。

================================================ ======= ======================

=== 我的实际问题 ===

现在使用我的 API 的各方提出了新的要求。他们希望使用多个密钥上传文件,如下面的屏幕截图所示。

我必须以不同的方式处理每个键的文件。因此,我不能使用我以前的代码

var files = context.Request.Files;

因为这段代码将所有文件一起返回,我无法确定哪个文件属于哪个键。

是否可以使用密钥检索文件?

【问题讨论】:

【参考方案1】:

参考:CodeCaster 在Select uploaded files by key 中的回答

我不知道任何可以按键检索文件的方法。

返回的列表内
var files = context.Request.Files;

可以通过数字索引访问单个文件,但不能通过键访问。 因此 files["keyName"] 返回 null。

但是,有一种迂回的方法可以确定哪些文件属于哪个键。代码如下:

                HttpContext context = HttpContext.Current;
                var files = context.Request.Files;
                var allKeys = files.AllKeys;
                Dictionary<string, List<HttpPostedFile>> allFilesByKeys = new Dictionary<string, List<HttpPostedFile>>();

                for (int i = 0; i < files.Count; i++)
                
                    string keyForThisFile = files.GetKey(i);
                    if (allFilesByKeys.ContainsKey(keyForThisFile))
                    
                        allFilesByKeys[keyForThisFile].Add(files[i]);
                    
                    else
                    
                        allFilesByKeys[keyForThisFile] = new List<HttpPostedFile>();
                        allFilesByKeys[keyForThisFile].Add(files[i]);
                    
                

【讨论】:

以上是关于从 ASP.NET MVC Web API 中的多个表单数据键接收文件的主要内容,如果未能解决你的问题,请参考以下文章

前端 ASP.NET MVC4 作为一个项目,ASP.NET Web API 作为同一解决方案中的另一个项目 - 如何从前端调用 WebAPI?

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

ASP.NET Web API 从 MVC 4 控制器失败

了解 ASP.NET(MVC、Web API)中的令牌生成/验证

ASP.NET Core 2.1 MVC - 无法设置从 Web api 响应接收到的 cookie

正确处理 ASP.net MVC 4 Web Api 路由中的嵌套资源