为啥 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 中的超时时间很短?

为啥 ASP.NET MVC 中的 SessionID 不断变化?

为啥我的 SelectListItem 无法编辑 ASP.NET Core MVC

这是错误的,为啥不是? ASP.NET MVC 视图包

为啥会收到奇怪的错误消息 asp.net mvc "elmah.mvc logging library"?

asp.net mvc为啥刷新页面后ajax响应