Skip to main content
 首页 » 编程设计

c#之无法使用 C# 客户端将 IFormFile 发送到 ASP.Net Core Web API

2024年02月05日29duanxz

我有一个 ASP.Net Core Web API,其 Controller POST 方法定义如下:

[HttpPost("SubmitFile")] 
public async Task<IActionResult> SubmitFile(IFormFile file) 
{ 
} 

我有一个调用 API SubmitFile() 方法的客户端方法,定义如下:

[HttpPost] 
public async Task<IActionResult> Index(ICollection<IFormFile> files) 
{ 
     using (var client = new HttpClient()) 
     { 
         client.BaseAddress = new Uri(_options.SiteSpecificUrl); 
 
         foreach (var file in files) 
         { 
             if (file.Length <= 0) 
                 continue; 
 
             var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 
             var fileContent = new StreamContent(file.OpenReadStream()); 
             fileContent.Headers.Add("X-FileName", fileName); 
             fileContent.Headers.Add("X-ContentType", file.ContentType); 
 
             var response = await client.PostAsync(_options.WebApiPortionOfUrl, fileContent); 
         } 
     } 
 
    return View(); 
} 

执行客户端发送时,在服务器端,SubmitFile() 中的断点显示文件参数为空。如何正确发送文件?保留服务器端 API 很重要,因为我有 Swashbuckle/Swagger 正确生成可以发送文件的 UI。

请您参考如下方法:

我找到了几种方法来做到这一点。这里是最简单的。请注意,这是一个 ASP.Net Core 客户端解决方案:

[HttpPost] 
public async Task<IActionResult> Index(ICollection<IFormFile> files) 
{ 
    using (var client = new HttpClient()) 
    { 
        client.BaseAddress = new Uri(_options.SiteSpecificUrl); 
 
        foreach (var file in files) 
        { 
            if (file.Length <= 0) 
                continue; 
 
            var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 
 
            using (var content = new MultipartFormDataContent()) 
            { 
                content.Add(new StreamContent(file.OpenReadStream()) 
                { 
                    Headers = 
                    { 
                        ContentLength = file.Length, 
                        ContentType = new MediaTypeHeaderValue(file.ContentType) 
                    } 
                }, "File", fileName); 
 
                var response = await client.PostAsync(_options.WebApiPortionOfUrl, content); 
            } 
        } 
    } 
} 

此 Controller 方法从 .cshtml 页面调用,如下所示:

@{ 
    ViewData["Title"] = "Home Page"; 
} 
 
<form method="post" asp-action="Index" asp-controller="Home" enctype="multipart/form-data"> 
    <input type="file" name="files" multiple /> 
    <input type="submit" value="Upload" /> 
</form> 

此表单显示两个按钮,“选择文件”和“上传”,前者显示“选择文件”对话框,后者调用 HomeController.Index 方法。