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

上传至Web API的文件始终大小为0,求排查解决(附C#代码)

我之前在做文件上传到Web API的时候也踩过这个“上传文件大小为0”的坑,结合你给出的代码片段,帮你排查几个最可能的原因,附解决办法:

常见问题与修复方案

  • 重复创建MultipartFormDataContent导致文件丢失
    你的代码里同时实例化了content和filesData两个MultipartFormDataContent对象,但看起来并没有把filesData关联到content中——这会导致最终发送的请求里完全没有文件内容。不需要嵌套创建,直接用外层的content来添加文件即可。

  • 文件流位置未重置,读取到空内容
    如果HttpPostedFileBase的InputStream之前被读取过(比如做过MD5校验),流的Position会停在末尾,这时候再上传就会得到大小为0的空文件。另外,创建StreamContent时要确保正确传入文件流,并配置好文件名和内容类型。

  • HttpClient请求发送不完整
    你的代码片段里看不到最终发送请求的逻辑(比如PostAsync调用),而且声明了HttpClientHandler却没有传给HttpClient构造函数,这可能导致请求配置错误或根本没发送出去。

修正后的完整代码示例

public async Task<Token> Upload(string fullMd5, IEnumerable<HttpPostedFileBase> files) 
{
    string uploadUrl = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    string jsonContent = string.Empty;
    
    // 如果需要自定义客户端配置,将handler传入HttpClient
    using (var handler = new HttpClientHandler())
    using (var client = new HttpClient(handler))
    {
        using (var content = new MultipartFormDataContent())
        {
            // 添加上传所需的额外参数(比如fullMd5,根据API要求调整参数名)
            content.Add(new StringContent(fullMd5), "fullMd5");
            
            foreach (var file in files)
            {
                // 跳过空文件或无效文件
                if (file == null || file.ContentLength <= 0)
                    continue;
                
                // 重置文件流位置到开头,避免因之前读取导致空流
                file.InputStream.Position = 0;
                
                var streamContent = new StreamContent(file.InputStream);
                // 从上传文件的ContentType中获取正确的媒体类型
                streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
                
                // 将文件添加到multipart内容:参数名要和API接收端一致,第三个参数是文件名
                content.Add(streamContent, "files", file.FileName);
            }
            
            // 发送POST请求到目标API
            var response = await client.PostAsync(uploadUrl, content);
            // 确保请求成功,否则抛出异常便于排查问题
            response.EnsureSuccessStatusCode();
            
            // 读取API返回的JSON内容并解析为Token对象
            jsonContent = await response.Content.ReadAsStringAsync();
            var token = JsonConvert.DeserializeObject<Token>(jsonContent);
            return token;
        }
    }
}

额外注意事项

  • 确认API端接收文件的参数名(比如代码里的"files")和你添加文件时的第二个参数完全一致,否则API无法识别并接收文件。
  • 如果需要传递其他表单参数,要通过content.Add(new StringContent(...))添加到MultipartFormDataContent中,不要直接拼在URL上。
  • 务必处理HttpPostedFileBase为空或ContentLength为0的情况,避免无效的上传请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:25:48