首页 > 解决方案 > 从 ASP.NET MVC Web API 中的多个表单数据键接收文件

问题描述

我正在研究ASP.NET MVC (.NET Framework) Web 应用程序中的Web API 。.NET 框架版本是4.7.2

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

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

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

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

在此处输入图像描述

注意:在 Postman 中,可以在 POST API 请求负载中添加文件(参见此处的方法),我正在使用该功能来测试我的 API。

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

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

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

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

在此处输入图像描述

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

var files = context.Request.Files;

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

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

标签: asp.netasp.net-mvcasp.net-web-apifile-upload

解决方案


参考:CodeCaster 在Select upload 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]);
                    }
                }

推荐阅读