软件开发
开发分享
软件下载

C#实现新浪图片上传源码解析

时间:2010-07-14 来源:juhe99 点击量:

C#实现新浪图片上传源码解析

很多人问我怎么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格式构造表单头部、文件数据和尾部

技术要点

实现关键点:

  1. 请求头设置:正确设置Accept、ContentType、Referer、UserAgent等头部信息

  2. Cookie认证:携带有效的登录Cookie确保上传权限

  3. 数据格式:严格按照multipart/form-data格式构造请求体

  4. 文件流处理:正确读取本地文件并写入请求流

  5. 边界处理:正确使用边界字符串分隔不同数据段

注意:代码中myReader.ReadBytes部分可能存在逻辑问题,建议直接使用FileStream的Read方法读取文件数据。同时需要确保str变量包含正确的边界字符串。