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

C#使用HttpClient PutAsync上传CSV时如何避免修改原文件内容

问题根因

你误用了MultipartFormDataContent类型。这个类型是专门构造multipart/form-data格式请求的,这类请求的请求体中会自动插入随机生成的boundary分隔符、每个内容段的Content-Disposition等协议头,用来区分同一个请求里携带的多个不同内容段(比如同时传文件+表单字段)。
你对接的服务端没有按照multipart格式解析请求,而是直接把整个请求体的原始字节当做CSV文件存储,自然会把这些协议头信息写入文件开头,就出现了首行混入多余内容的问题。

修复方案

如果合作方接口要求直接接收原始CSV文件内容(即PUT请求体直接是文件二进制流,是文件类接口最常见的raw上传模式),直接移除MultipartFormDataContent的相关逻辑,用StreamContent直接承载文件流即可,同时正确设置请求的Content-Type头。
修正后的可运行代码如下:

public async Task SendCsvFile(string path, string apiKey)
{
    try
    {
        LoggerService.Logger.CreateLog("Log");
        LoggerService.Logger.Info("Start:SendCsvFile");
        // using声明会自动释放资源,无需手动调用Close,避免资源泄漏
        using HttpClientHandler clientHandler = new HttpClientHandler();
        // 注意:生产环境请勿直接跳过SSL证书校验,仅测试环境可临时使用
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
        using HttpClient httpClient = new HttpClient(clientHandler);
        httpClient.DefaultRequestHeaders.Accept.Clear();   
        httpClient.DefaultRequestHeaders.Add("x-api-key", apiKey);
        string url = "https://test.csv";

        var fileName = Path.GetFileName(path);
        using FileStream fileStream = File.OpenRead(path);
        // 直接构造文件流内容,不再嵌套MultipartFormDataContent
        using StreamContent content = new StreamContent(fileStream);
        // 明确指定内容类型为CSV
        content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/csv");
        
        var response = await httpClient.PutAsync(url, content);
        if (response.IsSuccessStatusCode)
        {
            LoggerService.Logger.Info("File sent correctly.");
        }
        else
        {
            LoggerService.Logger.Error($"Error during sending. {response.StatusCode};{response.ReasonPhrase};");
        }
        LoggerService.Logger.Info("End:SendCsvFile");
    }
    catch (Exception ex)
    {
        LoggerService.Logger.Error(ex.ToString());
    }
}
补充说明
  • 你原有代码中x-api-key赋值写死了空字符串,修复后改为使用传入的apiKey参数,避免鉴权失败
  • 原有代码定义了streamContent变量但完全未使用,属于冗余代码,修复版本已移除
  • 如果和合作方确认后,对方明确要求必须使用multipart/form-data格式传参,那么问题不在客户端,是服务端解析逻辑错误:服务端必须按照multipart格式规范解析请求,提取对应文件段的内容再存储,而不是直接把整个请求体存为文件,这种情况下客户端无论怎么调整,只要使用multipart格式,请求体中就必然携带分隔符和段头信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:12:19