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

