上传文件附带JSON字符串时POST请求返回空结果问题求助
问题根因
- 核心错误1:官方上传逻辑是在同一个POST请求的multipart payload里同时携带JSON配置和文件二进制内容,你拆成两个独立请求发送,服务器端每次只收到一半参数,无法完成完整上传逻辑,自然不会返回预期的md5值。
- 核心错误2:字段名完全倒置:官方请求里JSON配置对应的
name是FileInstance,文件对应的name是文件名,你代码里刚好把两个字段的name写反了。 - 代码细节错误:
- 第一个请求构造完JSON的HttpContent后,根本没有调用
form.Add()把内容加到表单里,发的是空请求 - 第二个请求里设置完StreamContent的Header后,又重新实例化了一次StreamContent覆盖了原有配置,之前写的ContentDisposition完全不生效
- JSON序列化后的字段名要和官方请求一致,你代码里用的是
filename,官方请求里是fileName(注意大小写),如果服务器是大小写敏感的会直接识别失败。
- 第一个请求构造完JSON的HttpContent后,根本没有调用
修正后的代码示例
// 只需要发起一次POST请求,同时携带两个part var boundary = $"----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x"); MultipartFormDataContent form = new MultipartFormDataContent(boundary); form.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse($"multipart/form-data; boundary={boundary}"); // 构造FileInstance对应的JSON部分 MyFileClass currentFile = new MyFileClass(); currentFile.action = new List<string>() { "/public/my_folder" }; // 注意字段名要和官方请求一致,是fileName不是filename,必要的话给属性加[JsonProperty("fileName")]注解 currentFile.fileName = Path.GetFileName(Filename); currentFile.fileSize = Convert.ToInt32(new FileInfo(Filename).Length); currentFile.certification= new MyFileClass.Certification(); CreateCertification(currentFile.certification); var json = JsonConvert.SerializeObject(currentFile); HttpContent jsonContent = new StringContent(json, Encoding.UTF8, "application/json"); jsonContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "FileInstance" // 官方请求里JSON的name固定为FileInstance }; form.Add(jsonContent); // 构造文件部分 var stream = new FileStream(Filename, FileMode.Open, FileAccess.Read); HttpContent fileContent = new StreamContent(stream); var fileName = Path.GetFileName(Filename); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = fileName, // 文件对应的name是文件名 FileName = fileName }; // 可根据实际文件类型调整,通用场景可以用MimeMapping.GetMimeMapping(Filename)自动获取 fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/png"); form.Add(fileContent); // 仅发送一次请求 var response = await myHttpClient.PostAsync(url, form); // 不要用.Result,异步场景直接用await避免死锁 var result_str = await response.Content.ReadAsStringAsync();
额外注意点
- 如果上传的不是固定png格式的文件,可以用
MimeMapping.GetMimeMapping(Filename)自动获取正确的Content-Type - 确认你定义的
MyFileClass序列化后和官方请求的JSON结构完全一致,特别是字段大小写、嵌套结构不能出错
内容的提问来源于stack exchange,提问作者redvolt12
相关产品推荐
相关产品推荐

