从 c# 将 IFormFile 发布到 webAPI

Posted

技术标签:

【中文标题】从 c# 将 IFormFile 发布到 webAPI【英文标题】:Posting IFormFile to webAPI from c# 【发布时间】:2021-12-21 10:16:19 【问题描述】:

我有一个 Web API 方法,它接受一个小类结构中的 IFormFile 变量列表,以将文件上传到存储帐户。

public class FileInputModel

        public int ScenarioId  get; set; 
        public IList<IFormFile> UploadFiles  get; set; 



[HttpPost("UploadFiles")]
public async Task<IActionResult> UploadForm([FromForm] FileInputModel files)

    //UploadLogic

这对于使用 Postman 的 https 帖子非常有效,但我似乎不太明白如何使用我正在编写的 C# 程序执行此操作以直接链接到此 api。到目前为止,我有一些代码可以将 FileStreamResult 变量转换为 IformFile,然后发送一个 post 请求,但我不知道如何从我的电脑上的文件中获取 FileStreamResult。这是我目前的方法。

var json = JsonSerializer.Serialize(FileInputModel);
StringContent data = new StringContent(json, Encoding.UTF8, "application/json");

try

    using HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.PostAsync(url, data);

    return response;

【问题讨论】:

移除 [FromForm] 绑定 我的问题不在于接收端,而在于如何以任何正确的形式发送数据,以便 [FromForm] 不会改变任何内容,因为该功能可以正常工作 啊,所以根据您使用哪个前端框架进行调用,请确保添加标题 Content-type: multipart/form-data; 【参考方案1】:

我过于关注后端的 IFormFile 方面,而实际上该函数只是打开流然后在其他函数中使用。有了这个,我通过简单地在前端使用文件流连接 c# 程序并将信息作为 MultipartFormDataContent 类型发送来解决它。

using (var client = new HttpClient())
    
        using (var content = new MultipartFormDataContent())
        
            var fileName = Path.GetFileName(filePath);
            var fileStream = System.IO.File.Open(filePath, FileMode.Open);
            content.Add(new StreamContent(fileStream), "file", fileName);  

            var requestUri = baseURL;
            var request = new HttpRequestMessage(HttpMethod.Post, requestUri)  Content = content ;
            var result = await client.SendAsync(request);

            return;
        
    

【讨论】:

以上是关于从 c# 将 IFormFile 发布到 webAPI的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从 Asp.net Core IFormFile 上传到 Azure Blob 存储?

使用 Asp.NET Core 3.1 框架将文件上传到服务器时如何使用 IFormFile 作为属性?

在 EF Core 中将 IFormFile 上传到 FTP

IFormFile 拒绝从 vue 上传

如何在.net core 中创建缩略图?使用 IFormFile 的帮助

IFormFile 未从程序集“Microsoft.AspNetCore.Http 3.0”加载类型 Microsoft.AspNetCore.Http.Internal.FormFile'