c#上传图片

本文介绍了一种使用 C# 进行文件上传的方法,详细解释了如何构造 HTTP 请求及文件流,适用于需要上传文件的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天在研究开心网上传头像,上传的时候是一个文件域,跟常用的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参数,另外再附带上张筱祥抓的一个上传截图。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值