最终,我希望使用尽可能基本的 jQuery 代码和服务器上的 C# 代码来创建一个简单的文件上传页面,但我一直在服务器上收到空的 IFormFile。
有很多示例说明如何使用带有表单数据的 Ajax POST 以及在 ASP.NET Web API Controller 操作上接收 IFormFile。 然而,似乎他们每个人都必须尝试对代码进行多次调整才能使其正常工作。
我制作了一个简单的解决方案,仅使用 API 部分并使用 Postman 向其发送文件。我尝试了 Content-Type 和 Accept header 的不同组合,但总是收到空文件。
为了满足一些托管要求,我使用 OWIN 自行托管应用程序。 这是 Controller 代码,我使用了默认值 Controller 并编辑了后操作...
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);
}
然后这是我最近的 postman 尝试的 2 个屏幕截图。我已经匆忙地将它们放在 Wix 服务器上,所以如果它们还不可见,我深表歉意
此时,我会很高兴 Post 方法收到文件的非空值。
最佳答案
使用 [FromForm]
属性而不是 [FromBody]
并删除 Accept
和 Content-Type
header 。
编辑:
因此,看来我立即假设您正在使用 ASP.NET Core(尽管您另有指出),因为 IFormFile
是 Microsoft.AspNetCore.Http
命名空间类因此,这很自然地解释了为什么当您在 .NET Framework 上尝试此操作时它不起作用。
我认为从技术上讲,可以创建此 ASP.NET Core 接口(interface)的具体实现,然后创建一些特殊情况模型绑定(bind)器,但这肯定需要一些工作。
我不确定您在哪里找到了这些使 IFormFile
在 .NET Framework 中工作的示例,但是 I could'nt find any example.
我能找到的最接近 ASP.NET Core IFormFile
绑定(bind)的体验是这个 ApiMultipartFormFormatter ,它非常容易实现并且支持 HttpFile
绑定(bind)。一件不太明显的事情是,您需要将一些 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; }
}
关于c# - 如何修复 ASP.NET Web Api 从帖子接受的空 IFormFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57115005/