很多人问我怎么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变量包含正确的边界字符串。