架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 28786|回复: 2

[资料] c# Http访问帮助类,支持get post请求文件下载

[复制链接]
发表于 2016-6-28 10:51:50 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;

  8. namespace XX.Common.Http
  9. {
  10.         /// <summary>
  11.         /// Http访问帮助类
  12.         /// </summary>
  13.         public class HttpHelper
  14.         {
  15.                 /// <summary>
  16.                 /// HttpWebRequest 通过Post
  17.                 /// </summary>
  18.                 /// <param name="url">URI</param>
  19.                 /// <param name="postData">post数据</param>
  20.                 /// <returns></returns>
  21.                 public static string PostDataGetHtml(string url, string postData)
  22.                 {
  23.                         try
  24.                         {
  25.                                 byte[] data = Encoding.UTF8.GetBytes(postData);

  26.                                 Uri uri = new Uri(url);
  27.                                 HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;
  28.                                 if (req == null)
  29.                                 {
  30.                                         return "Network error:" + new ArgumentNullException("httpWebRequest").Message;
  31.                                 }
  32.                                 req.Method = "POST";
  33.                                 req.KeepAlive = true;
  34.                                 req.ContentType = "application/x-www-form-urlencoded";
  35.                                 req.ContentLength = data.Length;
  36.                                 req.AllowAutoRedirect = true;

  37.                                 Stream outStream = req.GetRequestStream();
  38.                                 outStream.Write(data, 0, data.Length);
  39.                                 outStream.Close();

  40.                                 var res = req.GetResponse() as HttpWebResponse;
  41.                                 if (res == null)
  42.                                 {
  43.                                         return "Network error:" + new ArgumentNullException("HttpWebResponse").Message;
  44.                                 }
  45.                                 Stream inStream = res.GetResponseStream();
  46.                                 var sr = new StreamReader(inStream, Encoding.UTF8);
  47.                                 string htmlResult = sr.ReadToEnd();

  48.                                 return htmlResult;
  49.                         }
  50.                         catch (Exception ex)
  51.                         {
  52.                                 return "网络错误(Network error):" + ex.Message;
  53.                         }
  54.                 }

  55.                 /// <summary>
  56.                 /// HttpWebRequest 通过get
  57.                 /// </summary>
  58.                 /// <param name="url">URI</param>
  59.                 /// <returns></returns>
  60.                 public static string GetDataGetHtml(string url)
  61.                 {
  62.                         try
  63.                         {
  64.                                 HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

  65.                                 httpWebRequest.ContentType = "application/x-www-form-urlencoded";
  66.                                 httpWebRequest.Method = "GET";
  67.                                 //对发送的数据不使用缓存
  68.                                 httpWebRequest.AllowWriteStreamBuffering = false;
  69.                                 httpWebRequest.Timeout = 300000;
  70.                                 httpWebRequest.ServicePoint.Expect100Continue = false;

  71.                                 HttpWebResponse webRespon = (HttpWebResponse)httpWebRequest.GetResponse();
  72.                                 Stream webStream = webRespon.GetResponseStream();
  73.                                 if (webStream == null)
  74.                                 {
  75.                                         return "网络错误(Network error):" + new ArgumentNullException("webStream");
  76.                                 }
  77.                                 StreamReader streamReader = new StreamReader(webStream, Encoding.UTF8);
  78.                                 string responseContent = streamReader.ReadToEnd();

  79.                                 webRespon.Close();
  80.                                 streamReader.Close();

  81.                                 return responseContent;
  82.                         }
  83.                         catch (Exception ex)
  84.                         {
  85.                                 return "网络错误(Network error):" + ex.Message;
  86.                         }
  87.                 }

  88.         /// <summary>
  89.         /// HttpWebRequest 通过get
  90.         /// </summary>
  91.         /// <param name="url">URI</param>
  92.         /// <returns></returns>
  93.         public static bool GetDataGetHtml(string url, string filePath,ref string mg)
  94.         {
  95.             try
  96.             {
  97.                 HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

  98.                 httpWebRequest.ContentType = "application/x-www-form-urlencoded";
  99.                 httpWebRequest.Method = "GET";
  100.                 //对发送的数据不使用缓存
  101.                 httpWebRequest.AllowWriteStreamBuffering = false;
  102.                 httpWebRequest.Timeout = 300000;
  103.                 httpWebRequest.ServicePoint.Expect100Continue = false;

  104.                 HttpWebResponse webRespon = (HttpWebResponse)httpWebRequest.GetResponse();
  105.                 Stream webStream = webRespon.GetResponseStream();
  106.                 if (webStream == null)
  107.                 {
  108.                     return false;
  109.                 }
  110.                 StreamReader streamReader = new StreamReader(webStream, Encoding.UTF8);
  111.                 string responseContent = streamReader.ReadToEnd();
  112.                 mg = responseContent;
  113.                 webRespon.Close();
  114.                 streamReader.Close();
  115.                 if (responseContent.ToUpper().IndexOf("NULL") > -1)
  116.                 {
  117.                     return false;
  118.                 }
  119.                 else
  120.                 {
  121.                     FileStream fs = new FileStream(filePath, FileMode.Create);
  122.                     var buff = Encoding.UTF8.GetBytes(responseContent);
  123.                     fs.Write(buff, buff.Length, 0);
  124.                     fs.Close();
  125.                     return true;
  126.                 }
  127.             }
  128.             catch (Exception ex)
  129.             {
  130.                 return false;
  131.             }
  132.         }


  133.                 /// <summary>
  134.                 /// 将本地文件上传到指定的服务器(HttpWebRequest方法)
  135.                 /// </summary>
  136.                 /// <param name="address">文件上传到的服务器</param>
  137.                 /// <param name="fileNamePath">要上传的本地文件(全路径)</param>
  138.                 /// <param name="saveName">文件上传后的名称</param>
  139.                 /// <returns>成功返回1,失败返回0</returns>
  140.                 public static int Upload_Request(string address, string fileNamePath, string saveName)
  141.                 {
  142.                         // 要上传的文件
  143.                         try
  144.                         {
  145.                                 if (!File.Exists(fileNamePath))
  146.                                 {
  147.                                         return 0;
  148.                                 }
  149.                                 FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
  150.                                 return Upload_Request(address, fs, saveName);
  151.                         }
  152.                         catch (Exception ex)
  153.                         {
  154.                                 return 0;
  155.                         }
  156.                 }

  157.                 /// <summary>
  158.                 /// 将本地文件流上传到指定的服务器(HttpWebRequest方法)
  159.                 /// </summary>
  160.                 /// <param name="address">文件上传到的服务器</param>
  161.                 /// <param name="fileStream">要上传的本地文件流</param>
  162.                 /// <param name="saveName">文件上传后的名称</param>
  163.                 /// <returns>成功返回1,失败返回0</returns>
  164.                 public static int Upload_Request(string address, Stream fileStream, string saveName)
  165.                 {
  166.                         int returnValue = 0;
  167.                         fileStream.Position = 0;
  168.                         var r = new BinaryReader(fileStream);
  169.                         //时间戳
  170.                         string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
  171.                         byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
  172.                         //请求头部信息
  173.                         StringBuilder sb = new StringBuilder();
  174.                         sb.Append("--");
  175.                         sb.Append(strBoundary);
  176.                         sb.Append("\r\n");
  177.                         sb.Append("Content-Disposition: form-data; name="");
  178.                         sb.Append("file");
  179.                         sb.Append(""; filename="");
  180.                         sb.Append(saveName);
  181.                         sb.Append(""");
  182.                         sb.Append("\r\n");
  183.                         sb.Append("Content-Type: ");
  184.                         sb.Append("application/octet-stream");
  185.                         sb.Append("\r\n");
  186.                         sb.Append("\r\n");
  187.                         string strPostHeader = sb.ToString();
  188.                         byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
  189.                         try
  190.                         {
  191.                                 // 根据uri创建HttpWebRequest对象
  192.                                 HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
  193.                                 httpReq.Method = "POST";
  194.                                 //对发送的数据不使用缓存
  195.                                 httpReq.AllowWriteStreamBuffering = false;
  196.                                 //设置获得响应的超时时间(300秒)
  197.                                 httpReq.Timeout = 300000;
  198.                                 httpReq.ServicePoint.Expect100Continue = false;
  199.                                 httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
  200.                                 long length = fileStream.Length + postHeaderBytes.Length + boundaryBytes.Length;
  201.                                 long fileLength = fileStream.Length;
  202.                                 httpReq.ContentLength = length;
  203.                                 byte[] buffer = new byte[fileLength];
  204.                                 Stream postStream = httpReq.GetRequestStream();
  205.                                 //发送请求头部消息
  206.                                 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  207.                                 int size = r.Read(buffer, 0, buffer.Length);
  208.                                 postStream.Write(buffer, 0, size);
  209.                                 //添加尾部的时间戳
  210.                                 postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
  211.                                 postStream.Close();
  212.                                 //获取服务器端的响应
  213.                                 HttpWebResponse webRespon = (HttpWebResponse)httpReq.GetResponse();
  214.                                 if (webRespon.StatusCode == HttpStatusCode.OK) //如果服务器未响应,那么继续等待相应                 
  215.                                 {
  216.                                         Stream s = webRespon.GetResponseStream();
  217.                                         StreamReader sr = new StreamReader(s);
  218.                                         //读取服务器端返回的消息
  219.                                         String sReturnString = sr.ReadLine();
  220.                                         s.Close();
  221.                                         sr.Close();
  222.                                         fileStream.Close();
  223.                                         if (sReturnString == "Success")
  224.                                         {
  225.                                                 returnValue = 1;
  226.                                         }
  227.                                         else
  228.                                         {
  229.                                                 returnValue = 0;
  230.                                         }
  231.                                 }
  232.                         }
  233.                         catch (Exception ex)
  234.                         {
  235.                                 returnValue = 0;
  236.                         }
  237.                         return returnValue;
  238.                 }
  239.                 /// <summary>
  240.                 /// 将本地文件上传到指定服务器上(HttpWebRequest方法),并传递相应参数
  241.                 /// </summary>
  242.                 /// <param name="url">文件上传到的服务器</param>
  243.                 /// <param name="fileKeyName">类型(此处为文件--file)</param>
  244.                 /// <param name="filePath">要上传的本地文件(全路径)</param>
  245.                 /// <param name="filename">文件上传后的名称</param>
  246.                 /// <param name="stringDict">参数集合</param>
  247.                 /// <param name="timeOut">请求时效</param>
  248.                 /// <returns></returns>
  249.                 public static string HttpPostData(string url, string fileKeyName, string filePath, string filename, NameValueCollection stringDict, int timeOut = 900000)
  250.                 {
  251.                         string responseContent;
  252.                         try
  253.                         {
  254.                                 var memStream = new MemoryStream();
  255.                                 var webRequest = (HttpWebRequest)WebRequest.Create(url);
  256.                                 // 边界符
  257.                                 var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
  258.                                 // 边界符
  259.                                 var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
  260.                                 var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  261.                                 // 最后的结束符
  262.                                 var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");

  263.                                 // 设置属性
  264.                                 webRequest.Method = "POST";
  265.                                 webRequest.Timeout = timeOut;
  266.                                 webRequest.ContentType = "multipart/form-data; boundary=" + boundary;

  267.                                 // 写入文件
  268.                                 const string filePartHeader = "Content-Disposition: form-data; name="{0}"; filename="{1}"\r\n" + "Content-Type: application/octet-stream\r\n\r\n";
  269.                                 var header = string.Format(filePartHeader, fileKeyName, filename);
  270.                                 var headerbytes = Encoding.UTF8.GetBytes(header);

  271.                                 memStream.Write(beginBoundary, 0, beginBoundary.Length);
  272.                                 memStream.Write(headerbytes, 0, headerbytes.Length);

  273.                                 var buffer = new byte[1024];
  274.                                 int bytesRead; // =0

  275.                                 while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
  276.                                 {
  277.                                         memStream.Write(buffer, 0, bytesRead);
  278.                                 }

  279.                                 // 写入字符串的Key
  280.                                 var stringKeyHeader = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name="{0}"" + "\r\n\r\n{1}\r\n";

  281.                                 foreach (byte[] formitembytes in from string key in stringDict.Keys select string.Format(stringKeyHeader, key, stringDict[key]) into formitem select Encoding.UTF8.GetBytes(formitem))
  282.                                 {
  283.                                         memStream.Write(formitembytes, 0, formitembytes.Length);
  284.                                 }

  285.                                 // 写入最后的结束边界符
  286.                                 memStream.Write(endBoundary, 0, endBoundary.Length);

  287.                                 webRequest.ContentLength = memStream.Length;

  288.                                 var requestStream = webRequest.GetRequestStream();

  289.                                 memStream.Position = 0;
  290.                                 var tempBuffer = new byte[memStream.Length];
  291.                                 memStream.Read(tempBuffer, 0, tempBuffer.Length);
  292.                                 memStream.Close();

  293.                                 requestStream.Write(tempBuffer, 0, tempBuffer.Length);
  294.                                 requestStream.Close();

  295.                                 var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();

  296.                                 using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding("utf-8")))
  297.                                 {
  298.                                         responseContent = httpStreamReader.ReadToEnd();
  299.                                 }

  300.                                 fileStream.Close();
  301.                                 httpWebResponse.Close();
  302.                                 webRequest.Abort();
  303.                         }
  304.                         catch (Exception ex)
  305.                         {
  306.                                 responseContent = ex.Message;
  307.                         }
  308.                         return responseContent;
  309.                 }

  310.                 /// <summary>
  311.                 /// Http下载文件支持断点续传
  312.                 /// </summary>
  313.                 /// <param name="uri">下载地址</param>
  314.                 /// <param name="filefullpath">存放完整路径(含文件名)</param>
  315.         /// <param name="size">每次多的大小</param>
  316.                 /// <returns>下载操作是否成功</returns>
  317.         public static bool HttpDownLoadFiles(string uri, string filefullpath, int size = 1024)
  318.                 {
  319.                         try
  320.                         {
  321.                                 string fileDirectory = System.IO.Path.GetDirectoryName(filefullpath);
  322.                                 if (!Directory.Exists(fileDirectory))
  323.                                 {
  324.                                         Directory.CreateDirectory(fileDirectory);
  325.                                 }
  326.                                 string fileFullPath = filefullpath;
  327.                                 string fileTempFullPath = filefullpath + ".tmp";

  328.                                 if (File.Exists(fileFullPath))
  329.                                 {
  330.                                         return true;
  331.                                 }
  332.                                 else
  333.                                 {
  334.                                         if (File.Exists(fileTempFullPath))
  335.                                         {
  336.                                                 FileStream fs = new FileStream(fileTempFullPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);

  337.                                                 byte[] buffer = new byte[512];
  338.                                                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);

  339.                                                 request.Timeout = 10000;
  340.                                                 request.AddRange((int)fs.Length);

  341.                                                 Stream ns = request.GetResponse().GetResponseStream();

  342.                                                 long contentLength = request.GetResponse().ContentLength;

  343.                                                 int length = ns.Read(buffer, 0, buffer.Length);

  344.                                                 while (length > 0)
  345.                                                 {
  346.                                                         fs.Write(buffer, 0, length);

  347.                                                         buffer = new byte[512];

  348.                                                         length = ns.Read(buffer, 0, buffer.Length);
  349.                                                 }

  350.                                                 fs.Close();
  351.                                                 File.Move(fileTempFullPath, fileFullPath);
  352.                                         }
  353.                                         else
  354.                                         {
  355.                                                 FileStream fs = new FileStream(fileTempFullPath, FileMode.Create);

  356.                                                 byte[] buffer = new byte[512];
  357.                                                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
  358.                                                 request.Timeout = 10000;
  359.                                                 request.AddRange((int)fs.Length);

  360.                                                 Stream ns = request.GetResponse().GetResponseStream();

  361.                                                 long contentLength = request.GetResponse().ContentLength;

  362.                                                 int length = ns.Read(buffer, 0, buffer.Length);

  363.                                                 while (length > 0)
  364.                                                 {
  365.                                                         fs.Write(buffer, 0, length);

  366.                                                         buffer = new byte[512];

  367.                                                         length = ns.Read(buffer, 0, buffer.Length);
  368.                                                 }

  369.                                                 fs.Close();
  370.                                                 File.Move(fileTempFullPath, fileFullPath);
  371.                                         }
  372.                                         return true;
  373.                                 }
  374.                         }
  375.                         catch (Exception ex)
  376.                         {
  377.                                 return false;
  378.                         }
  379.                 }

  380.         /// <summary>
  381.         /// Http下载文件
  382.         /// </summary>
  383.         /// <param name="uri">下载地址</param>
  384.         /// <param name="filefullpath">存放完整路径(含文件名)</param>
  385.         /// <param name="size">每次多的大小</param>
  386.         /// <returns>下载操作是否成功</returns>
  387.         public static bool DownLoadFiles(string uri, string filefullpath,int size=1024)
  388.         {
  389.             try
  390.             {
  391.                 if (File.Exists(filefullpath))
  392.                 {
  393.                     try
  394.                     {
  395.                         File.Delete(filefullpath);
  396.                     }
  397.                     catch (Exception ex)
  398.                     {
  399.                         return false;
  400.                     }
  401.                 }
  402.                 string fileDirectory = System.IO.Path.GetDirectoryName(filefullpath);
  403.                 if (!Directory.Exists(fileDirectory))
  404.                 {
  405.                     Directory.CreateDirectory(fileDirectory);
  406.                 }               
  407.                 FileStream fs = new FileStream(filefullpath, FileMode.Create);
  408.                 byte[] buffer = new byte[size];
  409.                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
  410.                 request.Timeout = 10000;
  411.                 request.AddRange((int)fs.Length);

  412.                 Stream ns = request.GetResponse().GetResponseStream();

  413.                 long contentLength = request.GetResponse().ContentLength;

  414.                 int length = ns.Read(buffer, 0, buffer.Length);

  415.                 while (length > 0)
  416.                 {
  417.                     fs.Write(buffer, 0, length);

  418.                     buffer = new byte[size];

  419.                     length = ns.Read(buffer, 0, buffer.Length);
  420.                 }
  421.                 fs.Close();                    
  422.                 return true;               
  423.             }
  424.             catch (Exception ex)
  425.             {
  426.                 return false;
  427.             }
  428.         }
  429.         }
  430. }
复制代码






上一篇:.Net Core 真能令微软的.Net 跨平台“蔓延”?
下一篇:js Json对象与Json字符串互转
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2016-6-28 11:06:22 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-12-10 08:45:38 | 显示全部楼层
试一下看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-7-18 10:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表