就像标题中所说的那样,我正在尝试将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。
答案 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
参数是什么,您都需要使用该名称上传或发送请求!