从控制台应用程序接收文件时,IFormFile始终为null

时间:2018-09-12 12:09:01

标签: c# .net .net-core asp.net-web-api2 asp.net-core-webapi-2.1

我已经准备好WebApi方法来接受文件,如下所示: (例如uri“ https://localhost:44397/api/uploadfile

 [Route("api/[controller]")]
 [ApiController]
 public class UploadFileController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm] IFormFile file)
    {
    }
}

我正在使用控制台应用程序将文件发送到此api方法,以下是我的代码:

    public static void Send(string fileName)
    {
        using (var client = new HttpClient())
        using (var content = new MultipartFormDataContent())
        {
            client.BaseAddress = new Uri("https://localhost:44397");
            var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            var index = fileName.LastIndexOf(@"\");
            var fn = fileName.Substring(index + 1);
            fs.Position = 0;

            var contentfile = new StreamContent(fs);
            content.Add(contentfile, "file", fn);
            var result = client.PostAsync("/api/uploadfile", content).Result;
        }
    }

我还与其他客户端(例如,邮递员)进行了检查,但那里也失败了(因此,这似乎是服务器端而不是控制台应用程序的问题)。

不确定我在做什么错。每当我检查WebApi方法文件参数始终为null时。

任何人都可以帮助我找到解决方案。我尝试搜索博客,但无济于事。我可能在这里做些天真。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:4)

最后我使它工作了。它一定是Microsoft中的错误,否则它们可能会从.net core 2.1 for ApiController更改工作方式。

我将我的WebApi方法更改为以下内容,并确保它有效。

注意:删除了ApiController并且它起作用了。 Microsoft应该对此进行记录。

[Route("api/[controller]")]
public class OCRController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm] IFormFile file)
    {
    }
}

这可能会帮助像我一样挣扎的人。

答案 1 :(得分:1)

该问题的答案仍然有效,但是对于任何想要保留[ApiController]属性的人,都有一种解决方法,如this GitHub线程中所述。

基本上,尝试像这样扩展[FromForm]属性...

[Route("api/[controller]")]
public class OCRController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm(Name = "file")] IFormFile file)
    {
    }
}

答案 2 :(得分:0)

尝试对您的MultipartFormDataContent

使用显式内容类型
var contentfile = new StreamContent(fs);
contentfile.Headers.ContentType = MimeMapping.GetMimeMapping(fileName);
content.Add(contentfile, "file", fn);