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

C# HttpWebRequest实现图片上传功能

时间:2010-01-01 来源:juhe99 点击量:

C# HttpWebRequest实现图片上传功能

前几天在研究开心网上传头像,上传的时候是一个文件域,跟常用的post数据有一些区别,需要自己构造头部以及文件流。

一开始对于文件流没什么思路,就在百度找相关资料,好不容易找到一个C#的,测试了下,还比较满意,但是对他的一些命名和参数不怎么习惯,如果修改下了,做成一个适合自己用的上传方法。byError决定发出来跟大家分享下!

核心代码实现

////// 上传图片文件
//////提交的地址///发送的文本串   比如:user=eking&pass=123456///文本域的名称  比如:name="file",那么fileformname=file///上传的文件路径  比如: c:\12.jpg///cookie数据///头部的跳转地址///public string HttpUploadFile(string url, string poststr, string fileformname, string filepath, string cookie, string refre)
{
    // 这个可以是改变的,也可以是下面这个固定的字符串
    string boundary = "—————————7d930d1a850658";

    // 创建request对象
    HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
    webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
    webrequest.Method = "POST";
    webrequest.Headers.Add("Cookie: " + cookie);
    webrequest.Referer = refre;

    // 构造发送数据
    StringBuilder sb = new StringBuilder();

    // 文本域的数据,将user=eking&pass=123456  格式的文本域拆分 ,然后构造
    foreach (string c in poststr.Split('&'))
    {
        string[] item = c.Split('=');
        if (item.Length != 2)
        {
            break;
        }
        string name = item[0];
        string value = item[1];
        sb.Append("--" + boundary);
        sb.Append("\r\n");
        sb.Append("Content-Disposition: form-data; name=\"" + name + "\"");
        sb.Append("\r\n\r\n");
        sb.Append(value);
        sb.Append("\r\n");
    }

    // 文件域的数据
    sb.Append("--" + boundary);
    sb.Append("\r\n");
    sb.Append("Content-Disposition: form-data; name=\"" + fileformname + "\"; filename=\"" + Path.GetFileName(filepath) + "\"");
    sb.Append("\r\n");
    sb.Append("Content-Type: image/pjpeg");
    sb.Append("\r\n\r\n");

    string postHeader = sb.ToString();
    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

    // 构造尾部数据
    byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

    FileStream fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
    long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
    webrequest.ContentLength = length;

    Stream requestStream = webrequest.GetRequestStream();

    // 输入头部数据
    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

    // 输入文件流数据
    byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
    int bytesRead = 0;
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        requestStream.Write(buffer, 0, bytesRead);

    // 输入尾部数据
    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
    
    fileStream.Close();
    requestStream.Close();

    WebResponse responce = webrequest.GetResponse();
    Stream s = responce.GetResponseStream();
    StreamReader sr = new StreamReader(s);

    // 返回数据流(源码)
    return sr.ReadToEnd();
}

使用说明:

  • url:目标上传地址

  • poststr:需要同时提交的表单数据,格式如"user=eking&pass=123456"

  • fileformname:文件域的name属性值

  • filepath:本地文件路径

  • cookie:认证所需的cookie信息

  • refre:Referer头部信息

注意事项:整个上传基本可以搞定了,一般的上传都需要带上cookie信息。代码中需要注意文件流的正确关闭,避免资源泄露。