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

使用WebClient构建多部分表单上传文件时遇400错误求助

问题排查与修复

你的代码存在两处关键语法错误,导致服务器无法识别名为"File"的表单部分:

1. 初始Boundary格式错误

Multipart表单的第一个边界符(boundary)前不能带换行符,必须以--{boundary}开头。原代码中多余的\r\n会破坏表单结构:

// 错误写法
byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
// 修正后
byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "\r\n");

2. Content-Disposition引号位置错误

构造表单字段头部时,name和filename的值必须用双引号包裹,且原代码中filename末尾多了一个多余的双引号,导致服务器无法解析字段名:

// 错误写法
System.Text.Encoding.ASCII.GetBytes($"Content-Disposition: form-data; name={fileField}; filename={fileName}\"\r\nContent-Type: application/octet-stream\r\n\r\n")
// 修正后
System.Text.Encoding.ASCII.GetBytes($"Content-Disposition: form-data; name=\"{fileField}\"; filename=\"{fileName}\"\r\nContent-Type: application/octet-stream\r\n\r\n")

额外验证点

  • 确保CombineBytes方法正确实现字节数组拼接,示例实现如下:
static byte[] CombineBytes(byte[] a, byte[] b)
{
    byte[] result = new byte[a.Length + b.Length];
    Buffer.BlockCopy(a, 0, result, 0, a.Length);
    Buffer.BlockCopy(b, 0, result, a.Length, b.Length);
    return result;
}
  • 确认fileBytes已正确读取为目标文档的字节数组,且apiUrl指向正确的服务器端点。

修复后核心代码片段

using (WebClient client = new WebClient())
{
    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    client.Headers[HttpRequestHeader.ContentType] = "multipart/form-data; boundary=" + boundary;

    byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
    byte[] trailerBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

    string fileField = "File";
    string fileName = "document.pdf";
    byte[] fileBytes = File.ReadAllBytes("path/to/your/document.pdf");

    byte[] requestBytes = new byte[0];
    requestBytes = CombineBytes(requestBytes, boundaryBytes);
    requestBytes = CombineBytes(requestBytes, System.Text.Encoding.ASCII.GetBytes($"Content-Disposition: form-data; name=\"{fileField}\"; filename=\"{fileName}\"\r\nContent-Type: application/octet-stream\r\n\r\n"));
    requestBytes = CombineBytes(requestBytes, fileBytes);
    requestBytes = CombineBytes(requestBytes, trailerBytes);

    byte[] responseBytes = client.UploadData(apiUrl, "POST", requestBytes);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:14