如何在 .NET Core 中发送和接收包含 multipart/form-data 的文件?
How to send and receive multipart/form-data containing files in .NET Core?
使用 .NET Core 3.1,我有以下构建 HTTP POST 包含 multipart/form-data 正文的 Http 客户端:
public async Task SendRequest(string randomString, IFormFileCollection files)
{
var form = new MultipartFormDataContent();
form.Add(new StringContent(randomString), "randomString");
foreach (var file in files)
{
var stream = new MemoryStream();
await file.CopyToAsync(stream, cancellationToken);
form.Add(new StreamContent(stream), "files");
}
using var request = new HttpRequestMessage(HttpMethod.Post, $"api/endpoint")
{
Content = form
};
await _httpClient.SendAsync(request);
}
接收控制器如下所示:
[Consumes("multipart/form-data")]
[HttpPost]
public async Task ReceiveForm([FromForm] RequestModel request)
{
//Do stuff
}
RequestModel
看起来像这样:
public class RequestModel
{
[JsonPropertyName("randomString")]
public string RandomString { get; set; }
[JsonPropertyName("files")]
public IFormFileCollection Files { get; set; }
}
我看到的问题是 requestModel.RandomString
被填充,但 requestModel.Files
没有填充 - 它为空。
我做错了什么?
感谢示例中的完美代码!
您应该将两个参数(名称和文件名)设置为文件 - form.Add(new StreamContent(stream), "files", "files");
方法说明:
Parameters:
content: The HTTP content to add to the collection.
name: The name for the HTTP content to add.
fileName: The file name for the HTTP content to add to the collection.
这是我的例子:
var fileName = "files";
var byteArrayContent = new ByteArrayContent(fileBytes1);
form.Add(byteArrayContent, fileName, fileName);
var stream = new MemoryStream(fileBytes2);
form.Add(new StreamContent(stream), fileName, fileName);
结果:
使用 .NET Core 3.1,我有以下构建 HTTP POST 包含 multipart/form-data 正文的 Http 客户端:
public async Task SendRequest(string randomString, IFormFileCollection files)
{
var form = new MultipartFormDataContent();
form.Add(new StringContent(randomString), "randomString");
foreach (var file in files)
{
var stream = new MemoryStream();
await file.CopyToAsync(stream, cancellationToken);
form.Add(new StreamContent(stream), "files");
}
using var request = new HttpRequestMessage(HttpMethod.Post, $"api/endpoint")
{
Content = form
};
await _httpClient.SendAsync(request);
}
接收控制器如下所示:
[Consumes("multipart/form-data")]
[HttpPost]
public async Task ReceiveForm([FromForm] RequestModel request)
{
//Do stuff
}
RequestModel
看起来像这样:
public class RequestModel
{
[JsonPropertyName("randomString")]
public string RandomString { get; set; }
[JsonPropertyName("files")]
public IFormFileCollection Files { get; set; }
}
我看到的问题是 requestModel.RandomString
被填充,但 requestModel.Files
没有填充 - 它为空。
我做错了什么?
感谢示例中的完美代码!
您应该将两个参数(名称和文件名)设置为文件 - form.Add(new StreamContent(stream), "files", "files");
方法说明:
Parameters:
content: The HTTP content to add to the collection.
name: The name for the HTTP content to add.
fileName: The file name for the HTTP content to add to the collection.
这是我的例子:
var fileName = "files";
var byteArrayContent = new ByteArrayContent(fileBytes1);
form.Add(byteArrayContent, fileName, fileName);
var stream = new MemoryStream(fileBytes2);
form.Add(new StreamContent(stream), fileName, fileName);
结果: