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

上传文件附带JSON字符串时POST请求返回空结果问题求助

问题根因
  • 核心错误1:官方上传逻辑是在同一个POST请求的multipart payload里同时携带JSON配置和文件二进制内容,你拆成两个独立请求发送,服务器端每次只收到一半参数,无法完成完整上传逻辑,自然不会返回预期的md5值。
  • 核心错误2:字段名完全倒置:官方请求里JSON配置对应的name是FileInstance,文件对应的name是文件名,你代码里刚好把两个字段的name写反了。
  • 代码细节错误:
    1. 第一个请求构造完JSON的HttpContent后,根本没有调用form.Add()把内容加到表单里,发的是空请求
    2. 第二个请求里设置完StreamContent的Header后,又重新实例化了一次StreamContent覆盖了原有配置,之前写的ContentDisposition完全不生效
    3. JSON序列化后的字段名要和官方请求一致,你代码里用的是filename,官方请求里是fileName(注意大小写),如果服务器是大小写敏感的会直接识别失败。
修正后的代码示例
// 只需要发起一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:42:01