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

C#使用Multipart/Form-Data上传文件时PDF正常JPG失败问题咨询

问题根因

你的multipart/form-data请求格式不符合规范,结束边界符前缺少必需的CRLF(\r\n)换行符,导致服务端无法正确解析上传的文件段:

  • 正常的multipart格式要求每个表单段结束后都要加\r\n,再跟上边界符
  • 你当前的代码在写完JPEG文件二进制内容后,直接拼接了结束边界符,JPEG文件末尾没有自带换行,服务端会把结束边界符识别为文件内容的一部分,自然找不到完整的文件段,所以request.Files.Count为0
  • 重命名的PDF能正常识别是巧合:PDF文件二进制末尾刚好自带换行符,刚好满足了格式要求

修复方案

修改请求体拼接逻辑,在文件内容和结束边界符之间插入ASCII编码的\r\n字节即可,同时修正不必要的StreamWriter使用错误(你原代码里用StreamWriter写字节数组属于错误用法,直接用基础Stream操作即可)。

修改后的代码片段:

private static HttpWebResponse CreateFileUploadRequest(string token)
{
    //Build Upload File API Request [POST]
    string url = ConfigurationManager.AppSettings["ApiUrl"] + "api/file/fileupload";

    var boundary = "-------------------------acebdf13572468";
    var boundaryStartBytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary);
    var boundaryEndBytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "--");
    // 新增:结束边界前的换行字节
    var newLineBytes = System.Text.Encoding.ASCII.GetBytes("\r\n");
    var contentType = "multipart/form-data; boundary=" + boundary;

    //build the outer request
    var httpWebRequest = BuildOuterRequest(url, contentType, token);

    //add the payload
    var fullFilePath = Settings.Instance.FileStoreFolderPath + @"\rickroll.jpg";
    var file = File.ReadAllBytes(fullFilePath);

    var contentDisposition = System.Text.Encoding.ASCII.GetBytes("\r\nContent-Disposition: form-data; name=\"file\"; filename=\"rickroll.jpg\"\r\n");
    var content = System.Text.Encoding.ASCII.GetBytes("Content-Type: image/jpeg\r\n\r\n");

    var data = boundaryStartBytes
        .Concat(contentDisposition)
        .Concat(content)
        .Concat(file)
        .Concat(newLineBytes) // 新增:文件内容后加换行,再跟结束边界
        .Concat(boundaryEndBytes).ToArray();

    httpWebRequest.ContentLength = data.Length;

    //Send the file:修正StreamWriter错误用法,直接用Stream
    using (var requestStream = httpWebRequest.GetRequestStream())
    {
        requestStream.Write(data, 0, data.Length);
        requestStream.Flush();
        // 这里不需要手动Close,using会自动释放
    }

    return (HttpWebResponse)httpWebRequest.GetResponse();
}

额外注意点

你日志里出现的filename="rickroll.png"和Content-Type: image/jpeg不匹配的问题,属于测试时的笔误,实际使用时保持文件名后缀和Content-Type一致即可,不影响本次文件识别的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:27:03