asp.net - 从 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;
因为此代码将所有文件一起返回,所以我无法确定哪个文件属于哪个键。
是否可以使用密钥检索文件?
解决方案
参考: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]);
}
}
推荐阅读
- spring-boot - Jhipster 和 Keycloak,客户端角色未通过 Feign 调用传递
- ruby-on-rails - 来自 rails API 的 json 请求返回错误代码
- python - Python:使用`export_media`(Google Drive API)下载PDF时传递`gridlines = false`
- python - Python 迭代器:prev() 和 next() 一样吗?
- node.js - 使用 mongoose 仅更新嵌套 json 文档中的一个元素
- ios - 在 iOS 中编写逐帧更新方法
- autosar - 如何使用具有线性类别的 CompuMethod
- google-cloud-automl - 训练后如何查看给定模型使用了多少计算资源?
- dask - 仪表板地址的 dask 分布式配置文件
- javascript - 儿童事件监听器