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
相关产品推荐
相关产品推荐

