2

最终,我希望有一个简单的文件上传页面,使用尽可能基本的 jQuery 代码和服务器上的 c# 代码,但我一直在服务器上收到空 IFormFile。

有很多示例说明了如何使用带有表单数据的 Ajax POST 并在 ASP.NET Web API 控制器操作上接收 IFormFile。然而,似乎他们每个人都不得不尝试对代码进行多次调整才能使其正常工作。

我用 API 部分做了一个简单的解决方案,并使用 Postman 向它发送文件。我尝试了 Content-Type 和 Accept 标头的不同组合,但我总是收到一个空文件。

为了满足一些托管要求,我使用 OWIN 来自托管应用程序。这是控制器代码,我使用了默认值控制器并编辑了后期操作...

    public string Post([FromBody]IFormFile file)
    {
        if (file != null)
        {
            return "Success: We got something!!!";
        }
        else
        {
           return "ERROR: We got nothing :-(";
        }

     }

我的 StartUp.cs 配置如下。尽管我的示例显示了 multipart/form-data,但我也尝试了 application/JSON 和其他格式,包括将它们留空。

public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute("default", "{controller}");
            config.EnableCors();

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseWebApi(config);
        }

然后这里是我最近的邮递员尝试的 2 个屏幕截图。我已经匆忙将它们放在 Wix 服务器上,如果它们还不可见,我深表歉意

身体

标题

在这一点上,我很高兴 Post 方法接收到一个文件的非空值。

4

1 回答 1

2

使用[FromForm]属性代替[FromBody]并删除AcceptContent-Type标题。

编辑:

因此,我似乎仓促地假设您正在使用 ASP.NET Core(尽管您另有说明),因为IFormFile它是Microsoft.AspNetCore.Http命名空间类,所以这自然解释了为什么当您在 .NET Framework 上尝试它时它不起作用。

我想从技术上讲,可以创建此 ASP.NET Core 接口的具体实现,然后创建一些特殊情况模型绑定器,但这肯定需要一些工作。

我不确定您在哪里找到了这些用于IFormFile在 .NET Framework 中工作的示例,但我找不到任何示例。

IFormFile我能找到的最接近 ASP.NET Core 绑定的体验是这个ApiMultipartFormFormatter,它超级容易实现并且支持HttpFile绑定。一件不是很明显的事情是您需要将一些HttpFile属性包装到另一个类中才能使其工作。

public string Post([FromForm]MyViewModel vm)
{
    if (vm.file != null)
    {
        return "Success: We got something!!!";
    }
    else
    {
        return "Sadness: We got null :-(";
    }
}

public class MyViewModel
{
    public HttpFile SomeFile { get; set; }
}
于 2019-07-19T15:47:39.483 回答