You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:55:28