为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?
Posted
技术标签:
【中文标题】为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?【英文标题】:Why would the ASP.NET MVC HttpFileCollection return an array of strings rather than a Collection of HttpPostedFile?为什么 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合? 【发布时间】:2020-09-01 16:02:21 【问题描述】:我有一个 AngularJS + ASP.NET MVC 5 应用程序,我正在尝试实现单个文件上传。
在客户端我有以下代码:
api.uploadFileV2 = function (alias, file, fnSuccess, fnError)
var formData = new FormData();
formData.append(file.name, file);
$http.post('/api/V2/Upload/' + alias, formData,
transformRequest: angular.identity,
headers: 'Content-Type': undefined
).success(function (data)
if (fnSuccess)
fnSuccess(data);
).error(function (data)
if (fnError)
fnError(data);
);
文件参数是通过单击按钮调用的函数传入的,当在 Chrome 和 Edge 中执行时,我可以看到文件参数实际上是一个文件对象。
回到服务器端,我有一个到控制器的路由,定义如下:
config.Routes.MapHttpRoute(
name: "V2UploadApi",
routeTemplate: "api/V2/Upload/alias/id",
defaults: new controller = "Upload", id = RouteParameter.Optional
);
回到服务器端,我有我的 UploadController,我在其中定义了以下方法:
public JArray Upload(string Alias)
JArray results = new JArray();
try
HttpRequest r = HttpContext.Current.Request;
HttpFileCollection c = r.Files;
foreach (var item in r.Files)
string theType = item.GetType().Name;
...
注意:使用 Alias 参数的奇怪方法签名的原因是最终上传的文件将由 Powershell 脚本管理,该脚本的选择和安全级别取决于别名值。
在执行 UploadController.Upload 方法后,我看到了我期望的 Alias 值。
我没有看到我的文件对象。所以 var item 并没有像我预期的那样解析为 HttpPostedFile 类型,而是解析为 string 类型 和变量 " theType”包含“字符串”而不是“HttpPostedFile”。 HttpFileCollection 实际上并不包含 HttpPostedFile 对象的集合,尝试将集合结果中的项目转换为 HttpPostedFile 类型会导致引发异常。
什么可能导致服务器端出现这种奇怪的行为,我可以做些什么来纠正它?
像上传文件这样基本的事情不应该这么困难,所以我肯定遗漏了一些明显的东西 - 问题是我没有看到它。
【问题讨论】:
【参考方案1】:所以在另一个调试会话之后,我将代码更改为:
HttpRequest r = HttpContext.Current.Request;
HttpFileCollection c = r.Files;
foreach (string key in r.Files.Keys)
var item = r.Files[key];
string theType = item.GetType().Name;
这段代码不仅有效,而且还符合我老式的编码风格,即不懒惰地使用 var 将所有内容完全交给编译器。我错误地假设 HttpFileCollection 的枚举器返回 (string)Key/(HttpPostedFile)Value 对,但我错了。
【讨论】:
以上是关于为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ASP.NET MVC 中的 SessionID 不断变化?
为啥我的 SelectListItem 无法编辑 ASP.NET Core MVC