【问题标题】:IFormFile is always null when receiving file from console app从控制台应用程序接收文件时,IFormFile 始终为空
【发布时间】:2018-09-12 12:09:00
【问题描述】:

我的 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;
        }
    }

我还检查了其他客户端(例如 Postman),但它也在那里失败了(所以这似乎是服务器端的问题,而不是控制台应用程序)。

不确定我在这里做错了什么。每当我检查我的 WebAPI 方法文件参数时始终为空。

谁能帮我找到解决办法?我尝试搜索博客无济于事。我可能在这里做一些幼稚的事情。

【问题讨论】:

  • 您需要隔离问题是在客户端(控制台)端还是服务器(Web api)端。要确认这一点,请告诉我们您是否能够从其他客户端(例如网络浏览器或邮递员)发布文件信息?如果没有,请将控制台应用程序放在一侧,并且在您让另一个客户端工作之前不要触摸它。然后回到控制台应用程序。
  • @mjwills 感谢您的建议。实际上,我可以在我的 Request.Form.Files 属性中看到文件,但我的参数 IFormFile 始终为空。那就是我试图修复的地方。似乎问题出在 [ApiController] 属性上。当我删除它时,它起作用了。

标签: c# .net-core asp.net-core-webapi


【解决方案1】:

最后我让它工作了。这一定是微软的一个错误,或者他们可能改变了 .net core 2.1 for ApiController 的工作方式。

我将我的 WebApi 方法更改为以下方法,瞧,它起作用了。

注意:删除 ApiController 并且它有效。微软应该记录这一点。

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

它可以帮助像我一样苦苦挣扎的人。

【讨论】:

  • 出色的工作解决了您的问题!我很高兴我对您的问题的评论帮助您缩小了原因,因为它是在服务器端而不是在客户端。我将编辑您的问题,以便将来阅读它的其他人更清楚。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    尝试将显式内容类型添加到您的 MultipartFormDataContent

    var contentfile = new StreamContent(fs);
    contentfile.Headers.ContentType = MimeMapping.GetMimeMapping(fileName);
    content.Add(contentfile, "file", fn);
    

    【讨论】:

    • 感谢您的建议,但没有奏效。我尝试使用代码 contentfile.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data");让 IFormFile 仍然为空。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2014-04-30
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多