如何用C# HttpClient通过Post请求发送多文件(Form-Data格式)
C# HttpClient实现Form-Data多文件上传
问题说明
对接某API时需通过HTTP Post协议上传多文件,Postman中可正常发送包含多个文件的文件数组,但在C#应用中使用HttpClient时仅能实现单文件上传。请求体必须为Form-Data格式,当前已使用MultipartFormDataContent对象,但仅支持单文件上传,需要实现与Postman一致的多文件上传行为。
当前单文件上传代码示例:
public async Task<SubmitIdentityResults> SubmitIdentity(Guid companyId, DocumentTypes docType, SubmitIdentityParameters submitIdentityParameters) { try { var accesstoken = await _authTokenFromClientID.GetAccessToken(); var client = _httpClientFactory.CreateClient("MyClient"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", accesstoken); MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new StreamContent(submitIdentityParameters.File!), "Files", submitIdentityParameters.FileName!); var response = await client.PostAsync($"api/Document/{docType.ToString()}", form); if (response.StatusCode == System.Net.HttpStatusCode.NoContent) { return default(SubmitIdentityResults)!; } return await response.Content.ReadFromJsonAsync<SubmitIdentityResults>() ?? default(SubmitIdentityResults)!; } catch (Exception) { throw; } }
解决方法
要实现多文件上传,只需循环将每个文件添加到MultipartFormDataContent中,且保持每个文件的表单键名一致(需与Postman中使用的键名相同,此处为Files),后端即可识别为文件数组。
1. 调整参数类结构
修改SubmitIdentityParameters类,将单个文件属性替换为文件集合:
public class SubmitIdentityParameters { // 替换原单个File和FileName为多文件集合 public List<(Stream FileStream, string FileName)> Files { get; set; } = new List<(Stream, string)>(); // 其他原有属性... }
2. 修改上传方法实现多文件添加
修改后的完整上传代码:
public async Task<SubmitIdentityResults> SubmitIdentity(Guid companyId, DocumentTypes docType, SubmitIdentityParameters submitIdentityParameters) { try { var accesstoken = await _authTokenFromClientID.GetAccessToken(); var client = _httpClientFactory.CreateClient("MyClient"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", accesstoken); MultipartFormDataContent form = new MultipartFormDataContent(); // 循环添加所有文件,保持表单键名为"Files" foreach (var fileItem in submitIdentityParameters.Files) { // 重置文件流位置到开头,避免流已读取导致上传内容为空 fileItem.FileStream.Position = 0; form.Add(new StreamContent(fileItem.FileStream), "Files", fileItem.FileName); } var response = await client.PostAsync($"api/Document/{docType.ToString()}", form); if (response.StatusCode == System.Net.HttpStatusCode.NoContent) { return default(SubmitIdentityResults)!; } return await response.Content.ReadFromJsonAsync<SubmitIdentityResults>() ?? default(SubmitIdentityResults)!; } catch (Exception) { throw; } }
注意事项
- 确保表单键名与API要求完全一致,否则后端无法正确解析文件数组。
- 若文件流已被读取过,必须重置位置到开头,否则上传的文件内容为空。
- 如果文件来源是ASP.NET Core的
IFormFile,可直接调用IFormFile.OpenReadStream()获取流,IFormFile.FileName作为文件名。
内容的提问来源于stack exchange,提问作者Thomas ESCUDERO
相关产品推荐
相关产品推荐

