WebRequest POST同时包含文件和参数

nik*_*ers 13 .net c# post http httpwebrequest

我正在尝试使用.NET/C#上传文件并将一些参数发送到我的网站.阅读了一些做一些参数或文件的教程后,我尝试过,但未成功地将它们组合起来.以下是我尝试这样做的方法:

WebRequest req = WebRequest.Create(baseURL + "upload");
req.Credentials = new NetworkCredential(username, password);
String boundary = "B0unD-Ary";
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
((HttpWebRequest)req).UserAgent = "UploadTester v0.1";

string postData = "--" + boundary + "\nContent-Disposition: form-data\n";
postData += "myId=123&someFk=456";
postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\" Content-Type: application/pdf\n\n";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

byte[] filedata = null;
using (BinaryReader reader = new BinaryReader(File.OpenRead("myfile.pdf")))
    filedata = reader.ReadBytes((int)reader.BaseStream.Length);

req.ContentLength = byteArray.Length + filedata.Length;
req.GetRequestStream().Write(byteArray, 0, byteArray.Length);
req.GetRequestStream().Write(filedata, 0, filedata.Length);

WebResponse response = req.GetResponse();
Stream data = response.GetResponseStream();
StreamReader sReader = new StreamReader(data);
String sResponse = sReader.ReadToEnd();
response.Close();
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我得到一个500异常,说"Header部分有超过10240个bnytes(可能没有正确终止)",Wireshark通知我发送的请求是格式错误的包,其中MIME多部分格式错误.

这里可能有几个问题,所以请告诉我你能发现的所有问题

更新:要将MIME与C#/ .NET分开,我在这里产生了一个帖子:https://stackoverflow.com/questions/1880002/error-in-mime-packet-for-http-post

更新2:因此后端确实存在内容长度问题,表示可用于读取的字节数小于指定的内容长度.但!如果我相应地减少req.ContentLength中的内容长度,我没有足够大的缓冲区大小来发送数据.有什么建议?

更新3:实际上,与包含的数据量相比,标题看起来太大了

Gon*_*alo 11

问题是你错过了'\n'.以下行:

string postData = "--" + boundary + "\nContent-Disposition: form-data\n";
Run Code Online (Sandbox Code Playgroud)

应该:

string postData = "--" + boundary + "\nContent-Disposition: form-data\n\n";
Run Code Online (Sandbox Code Playgroud)

这一行:

postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\" Content-Type: application/pdf\n\n"
Run Code Online (Sandbox Code Playgroud)

在'Content-Type'之前缺少'\n'.它应该是:

postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"upload.pdf\"\nContent-Type: application/pdf\n\n"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你指出这些.经过大约15个小时的调试,我发现了一个主要问题:.NET引擎将我的所有新行转换为CR +换行符,因此写入的内容比我在内容长度中指定的字节多.因此,对于将来遇到类似问题的任何人:用CR +换行符替换所有换行符(\n到\ r \n \n) (3认同)