c#上传图片

    xiaoxiao2021-03-25  16

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

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

    /// <summary>       /// 上传图片文件       /// </summary>       /// <param name="url">提交的地址</param>       /// <param name="poststr">发送的文本串   比如:user=eking&pass=123456  </param>       /// <param name="fileformname">文本域的名称  比如:name="file",那么fileformname=file  </param>       /// <param name="filepath">上传的文件路径  比如: c:/12.jpg </param>       /// <param name="cookie">cookie数据</param>       /// <param name="refre">头部的跳转地址</param>       /// <returns></returns>       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=/"icon/";filename=/"" + filepath + "/"");           sb.Append("/r/n");

             sb.Append("Content-Type: ");           sb.Append("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);           WebResponse responce = webrequest.GetResponse();           Stream s = responce.GetResponseStream();           StreamReader sr = new StreamReader(s);

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

    整个上传基本可以搞定了,一般的上传都需要带上cookie信息,所以张筱祥在参数里加了个cookie参数,另外再附带上张筱祥抓的一个上传截图。

    转载请注明原文地址: https://ju.6miu.com/read-300189.html

    最新回复(0)