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

ste*_*ula 4 c# .net-core asp.net-core asp.net-core-webapi

我有一个 ASP.Net Core Web API,控制器 POST 方法定义如下:

[HttpPost("SubmitFile")]
public async Task<IActionResult> SubmitFile(IFormFile file)
{
}
Run Code Online (Sandbox Code Playgroud)

我有一个客户端方法来调用 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();
}
Run Code Online (Sandbox Code Playgroud)

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

ste*_*ula 8

我找到了几种方法来做到这一点。这里是最简单的。请注意,这是一个 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个控制器方法是从 .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>
Run Code Online (Sandbox Code Playgroud)

此窗体显示两个按钮,“选择文件”,它显示一个“选择文件”对话框,以及“上传”,它调用 HomeController.Index 方法。