*注意事项
要设置分割线 ,其中分割线无论是否包含“--”,在组装消息头时都要加上“--”(两个 “-”),结束时也要加上“--”(两个 “-”)另外,
建议在开发的时候可以使用Fiddler抓包工具来测试自己的请求信息,与成功的信息对比。
具体方法如下:
/// <summary>
/// 上传文件时的设置
/// </summary>
private static void SetMessage(HttpWebRequest webRequest, string urlString,string uploadLocalPath) {
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urlString);
webRequest.ContentType = "multipart/form-data";
//参数分割线
string boundary = "-----" + DateTime.Now.Ticks.ToString();
webRequest.ContentType += "; boundary=" + boundary;//添加分割线,告诉服务器自定义分割线是什么
//设置POST消息头
StringBuilder startStrBuilder = new StringBuilder();
startStrBuilder.AppendFormat("--{0}", boundary);//此处注意开头要添加 -- ,无论分割线中是否包含 --
startStrBuilder.Append("\r\n");
startStrBuilder.Append("Content-Disposition: form-data; name=\"editorFiles\"; filename=\"");
startStrBuilder.Append(Path.GetFileName(uploadLocalPath));
startStrBuilder.Append("\"");
startStrBuilder.Append("\r\n");
startStrBuilder.Append("Content-Type: image/jpeg");
startStrBuilder.Append("\r\n");
startStrBuilder.Append("\r\n");
string strPostHeader = startStrBuilder.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
//POST消息尾
StringBuilder endStrBuilder = new StringBuilder();
endStrBuilder.Append("\r\n");
endStrBuilder.AppendFormat("--{0}--", boundary); //此处开头与尾注意要添加 -- ,无论分割线中是否包含 --
endStrBuilder.Append("\r\n");
byte[] boundaryBytes = Encoding.UTF8.GetBytes(endStrBuilder.ToString());
using (FileStream fs = new FileStream(uploadLocalPath, FileMode.Open, FileAccess.Read)) {
long length = postHeaderBytes.Length + fs.Length + boundaryBytes.Length;
webRequest.ContentLength = length;
using (Stream requestStream = webRequest.GetRequestStream()) {
//写入消息头
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
//写入文件内容
byte[] buffer = new byte[checked((uint)Math.Min(4096, (int)fs.Length))];
int bytesRead = 0;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0) {
requestStream.Write(buffer, 0, bytesRead);
}
//写入消息尾部
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
}
}
}
}