使用HttpClient将Zip文件上传到ASP.NET Core WebAPI服务,但IFormData参数始终为null

时间:2019-07-02 07:16:05

标签: c# wpf asp.net-core-webapi dotnet-httpclient

就像标题中所说的那样,我正在尝试将WPF应用程序中的.zip上传到我的.NET Core Web API。

经过研究,我发现可以使用MultiPartDataContent并以这种方式发送它。

用于将数据发送到服务器的代码如下:

            {
                client.BaseAddress = new Uri("http://localhost:62337/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                string filepath = @"C:\Users\uic10950\Desktop\Meeting2Text\RecordingApp\bin\mixedaudio.zip";
                string filename = "mixedaudio.zip";

                MultipartFormDataContent content = new MultipartFormDataContent();
                ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
                content.Add(fileContent);

                HttpResponseMessage response = await client.PostAsync("api/transcriptions/recording", content);
                string returnString = await response.Content.ReadAsAsync<string>();
            }

在服务器端,我的控制器动作如下:

        public async Task<IActionResult> AddFileToTranscription([FromForm] IFormFile file)
        {
            using (var sr = new StreamReader(file.OpenReadStream()))
            {
                var content = await sr.ReadToEndAsync();
                return Ok(content);
            }
        }

文件上传成功后,此操作代码将更改

根据我在研究中所了解的内容,应该在以下位置找到我的文件:

  

[FromForm] IFormFile

动作的文件属性,但不幸的是,它为null。

1 个答案:

答案 0 :(得分:1)

您做错了几件事:

public async Task<IActionResult> AddFileToTranscription([FromForm] IFormFile file)

❌您不需要[FromFile]属性。

❌您的文件参数名称为file,但在客户端上载文件时尚未定义它。

❌您无需添加ContentDisposition并将其设置为attachment,因为它是响应而不是请求! (1)


✅服务器:

public async Task<IActionResult> AddFileToTranscription( IFormFile file)
{
    using (var sr = new StreamReader(file.OpenReadStream()))
    {
        var content = await sr.ReadToEndAsync();
        return Ok(content);
    }
}

✅客户:

client.BaseAddress = new Uri("http://localhost:62337/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

string filepath = @"C:\Users\uic10950\Desktop\Meeting2Text\RecordingApp\bin\mixedaudio.zip";
string filename = "mixedaudio.zip";

MultipartFormDataContent content = new MultipartFormDataContent();
ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

// ➡ ✅ important change fileContent, form-input-name, real-file-name
content.Add(fileContent, "file", filename);

HttpResponseMessage response = await client.PostAsync("api/transcriptions/recording", content);
string returnString = await response.Content.ReadAsAsync<string>();

MultipartFormDataContent.Add方法在添加表单数据时有两个重载,您必须使用以下overload

public void Add (System.Net.Http.HttpContent content, string name, string fileName);

结论:

无论您的IFormData参数是什么,您都需要使用该名称上传或发送请求!


  1. 在常规HTTP响应中,Content-Disposition响应标头是一个标头,指示是否希望在浏览器中内联显示内容,即作为网页还是作为网页的一部分,或者作为附件,可以在本地下载并保存。