这个是文件和参数一起传递的方法,multipart/form-data 方式,这个方法稍微复杂点,因为模拟了浏览器处理分隔符等行为,一般用于传文件,代码如下:
using System;
using System.Text;
using System.Collections.Generic;
using System.Net;
using System.IO;
public class UploadFile
{
public UploadFile()
{
ContentType = "application/octet-stream";
}
public string Name { get; set; }
public string Filename { get; set; }
public string ContentType { get; set; }
public byte[] StreamContent { get; set; }
}
public string HttpPostFile(string url, IEnumerable<UploadFile> files, IDictionary<string, string> values)
{
var request = WebRequest.Create(url);
request.Method = "POST";
var boundary = "------------------" + DateTime.Now.ToString("yyyyMMddHHmmss");
request.ContentType = "multipart/form-data; boundary=" + boundary;
boundary = "--" + boundary;
using (var requestStream = request.GetRequestStream())
{
//遍历键值
foreach (string name in values.Keys)
{
var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
}
//遍历文件
foreach (var file in files)
{
var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType, Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Write(file.StreamContent, 0, file.StreamContent.Length);
buffer = Encoding.UTF8.GetBytes(Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
}
var boundaryBuffer = Encoding.UTF8.GetBytes(boundary + "--");
requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
}
try
{
var stream = new MemoryStream();
request.GetResponse().GetResponseStream().CopyTo(stream);
return Encoding.UTF8.GetString(stream.ToArray());
}
catch (WebException ex)
{
var stream = new MemoryStream();
ex.Response.GetResponseStream().CopyTo(stream);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
一般情况下这里面的 Name、Filename 参数意义不大,完全取决于服务端如何使用,这个方法里面组合边界符和换行符的时候非常严谨,甚至换几个行都是有讲究的。