从 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(MVC、Web API)中的令牌生成/验证