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

.NET Core 3.1中发送接收含文件的multipart/form-data时文件集合为null的问题排查

问题分析与解决方案

咱们来拆解一下你遇到的问题:RequestModel.Files始终为null,主要有两个核心问题需要修正,我一步步给你说明:

1. 模型绑定的属性标记用错了

你的RequestModel里用了[JsonPropertyName],但这个特性是专门给JSON序列化/反序列化用的,而[FromForm]表单绑定依赖的是表单字段名与属性名的匹配,或者用[FromForm(Name = "xxx")]来显式指定对应字段。所以得把模型里的特性换成表单绑定专用的:

public class RequestModel {
    [FromForm(Name = "randomString")]
    public string RandomString { get; set; }
    [FromForm(Name = "files")]
    public IFormFileCollection Files { get; set; }
}

如果字段名和属性名的驼峰匹配能生效(比如randomString对应RandomString),也可以去掉特性,但显式标注能避免歧义,更稳妥。

2. HttpClient发送文件时的两个关键错误

(1)MemoryStream的Position未重置

你把文件内容复制到MemoryStream后,流的Position会停在末尾,这时候StreamContent去读取时会拿不到任何内容,接收端自然识别不到文件。所以复制完成后必须把Position重置为0:

await file.CopyToAsync(stream, cancellationToken);
stream.Position = 0; // 这行是关键,必须加!

(2)添加文件时缺少文件名参数

往MultipartFormDataContent里加StreamContent时,需要指定文件名(第三个参数),否则接收端无法将其识别为文件集合。修改后的循环代码:

foreach (var file in files) {
    var stream = new MemoryStream();
    await file.CopyToAsync(stream, cancellationToken);
    stream.Position = 0;
    // 第三个参数传入原文件的文件名,让接收端能正确识别文件
    form.Add(new StreamContent(stream), "files", file.FileName);
}

修正后的完整发送端代码

public async Task SendRequest(string randomString, IFormFileCollection files, CancellationToken cancellationToken) {
    var form = new MultipartFormDataContent();
    form.Add(new StringContent(randomString), "randomString");
    foreach (var file in files) {
        var stream = new MemoryStream();
        await file.CopyToAsync(stream, cancellationToken);
        stream.Position = 0;
        form.Add(new StreamContent(stream), "files", file.FileName);
    }
    using var request = new HttpRequestMessage(HttpMethod.Post, $"api/endpoint") { Content = form };
    await _httpClient.SendAsync(request, cancellationToken);
}

额外注意事项

  • 确保你的_httpClient没有被错误配置(比如手动修改了Content-Type),MultipartFormDataContent会自动设置正确的Content-Type并生成边界符,一般不需要手动干预。
  • 可以用抓包工具(比如Fiddler)验证请求的Content-Type确实是multipart/form-data,且包含正确的文件字段和内容。

这样修改后,接收端的request.Files应该就能正常获取到上传的文件集合了。

内容的提问来源于stack exchange,提问作者asker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:22:39