很多人问我怎么post上传图片,我总结了一下,干脆贴出代码来吧,很清晰的思路。
// 设置请求头信息
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.ContentType = "multipart/form-data; boundary=---------------------------7dc3d8cb0282";
request.Referer = this.reffer;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1";
request.Method = "POST";
request.Headers.Add("Cookie: " + this.cokie);
// 构造表单数据
StringBuilder builder = new StringBuilder();
builder.Append(str + "\r\n"); // str应为边界字符串
builder.Append(Environment.NewLine);
builder.Append("avatar" + "\r\n"); // 表单字段名
builder.Append(str + "\r\n");
builder.Append(Environment.NewLine);
builder.Append("1" + "\r\n"); // 可能是字段值
builder.Append(str); // 边界字符串
builder.Append("\r\n");
builder.Append("\r\n");
builder.Append("Content-Type: ");
builder.Append("image/jpeg");
builder.Append("\r\n\r\n");
string s = builder.ToString();
byte[] bytes = Encoding.UTF8.GetBytes(s); // 表单头部数据
byte[] buffer = Encoding.ASCII.GetBytes("\r\n" + str + "--\r\n"); // 表单尾部数据
try
{
FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
long num = (bytes.Length + stream.Length) + buffer.Length;
request.ContentLength = num;
Stream requestStream = request.GetRequestStream();
// 写入表单头部
requestStream.Write(bytes, 0, bytes.Length);
// 写入图片文件数据
byte[] buffer3 = myReader.ReadBytes((int)stream.Length); // 注意:这里应该直接使用stream.Read
requestStream.Write(buffer3, 0, buffer3.Length);
// 写入表单尾部
requestStream.Write(buffer, 0, buffer.Length);
// 关闭流
stream.Close();
requestStream.Close();
}
catch (Exception ex)
{
// 异常处理
Console.WriteLine("上传失败: " + ex.Message);
}Content-Type:使用multipart/form-data格式,这是文件上传的标准格式
Boundary:边界字符串用于分隔不同的表单字段
Referer:设置来源页面,模拟浏览器行为
Cookie:携带认证信息,确保上传权限
数据构造:按照multipart格式构造表单头部、文件数据和尾部
请求头设置:正确设置Accept、ContentType、Referer、UserAgent等头部信息
Cookie认证:携带有效的登录Cookie确保上传权限
数据格式:严格按照multipart/form-data格式构造请求体
文件流处理:正确读取本地文件并写入请求流
边界处理:正确使用边界字符串分隔不同数据段
注意:代码中myReader.ReadBytes部分可能存在逻辑问题,建议直接使用FileStream的Read方法读取文件数据。同时需要确保str变量包含正确的边界字符串。