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

4
我已经准备好我的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)方面。为了确认这一点,请告诉我们是否能够从其他客户端(例如Web浏览器或Postman)发布文件信息?如果不能,请将控制台应用程序放到一边,不要碰它,直到您让另一个客户端工作。然后再回到控制台应用程序。 - mjwills
@mjwills 感谢您的建议。实际上,我可以在我的Request.Form.Files属性中看到文件,但是我的参数IFormFile始终为空。这就是我试图解决的问题。似乎问题出在[ApiController]属性上。当我将其删除时,它起作用了。 - Joshua I
3个回答

5

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

我将我的 WebApi 方法更改为以下内容,然后它就起作用了。

注意:删除了 ApiController 就可以了。微软应该记录这个。

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

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


做得好,解决了你的问题!我很高兴我的评论帮助你缩小了问题的范围,确定问题出在服务器端而不是客户端。我会编辑你的问题,以便未来其他人阅读时更清楚明白。 - mjwills

2
这个问题的答案仍然适用,但是对于想要保留[ApiController]属性的人,可以按照这个GitHub主题中描述的方法进行解决。
基本上,尝试像这样扩展[FromForm]属性...
[Route("api/[controller]")]
public class OCRController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm(Name = "file")] IFormFile file)
    {
    }
}

0

尝试将显式内容类型添加到您的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。 - Joshua I

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接