/// <summary>
/// 上传数据参数
/// </summary>
public class UploadEventArgs : EventArgs
{
int bytesSent;
int totalBytes;
/// <summary>
/// 已发送的字节数
/// </summary>
public int BytesSent
{
get { return bytesSent; }
set { bytesSent = value; }
}
/// <summary>
/// 总字节数
/// </summary>
public int TotalBytes
{
get { return totalBytes; }
set { totalBytes = value; }
}
}
/// <summary>
/// 下载数据参数
/// </summary>
public class DownloadEventArgs : EventArgs
{
int bytesReceived;
int totalBytes;
byte[] receivedData;
/// <summary>
/// 已接收的字节数
/// </summary>
public int BytesReceived
{
get { return bytesReceived; }
set { bytesReceived = value; }
}
/// <summary>
/// 总字节数
/// </summary>
public int TotalBytes
{
get { return totalBytes; }
set { totalBytes = value; }
}
/// <summary>
/// 当前缓冲区接收的数据
/// </summary>
public byte[] ReceivedData
{
get { return receivedData; }
set { receivedData = value; }
}
} public class WebClient
{
Encoding encoding = Encoding.Default;
string respHtml = "";
WebProxy proxy;
static CookieContainer cc;
WebHeaderCollection requestHeaders;
WebHeaderCollection responseHeaders;
int bufferSize = ;
public event EventHandler<UploadEventArgs> UploadProgressChanged;
public event EventHandler<DownloadEventArgs> DownloadProgressChanged;
static WebClient()
{
LoadCookiesFromDisk();
}
/// <summary>
/// 创建WebClient的实例
/// </summary>
public WebClient()
{
requestHeaders = new WebHeaderCollection();
responseHeaders = new WebHeaderCollection();
}
/// <summary>
/// 设置发送和接收的数据缓冲大小
/// </summary>
public int BufferSize
{
get { return bufferSize; }
set { bufferSize = value; }
}
/// <summary>
/// 获取响应头集合
/// </summary>
public WebHeaderCollection ResponseHeaders
{
get { return responseHeaders; }
}
/// <summary>
/// 获取请求头集合
/// </summary>
public WebHeaderCollection RequestHeaders
{
get { return requestHeaders; }
}
/// <summary>
/// 获取或设置代理
/// </summary>
public WebProxy Proxy
{
get { return proxy; }
set { proxy = value; }
}
/// <summary>
/// 获取或设置请求与响应的文本编码方式
/// </summary>
public Encoding Encoding
{
get { return encoding; }
set { encoding = value; }
}
/// <summary>
/// 获取或设置响应的html代码
/// </summary>
public string RespHtml
{
get { return respHtml; }
set { respHtml = value; }
}
/// <summary>
/// 获取或设置与请求关联的Cookie容器
/// </summary>
public CookieContainer CookieContainer
{
get { return cc; }
set { cc = value; }
}
/// <summary>
/// 获取网页源代码
/// </summary>
/// <param name="url">网址</param>
/// <returns></returns>
public string GetHtml(string url)
{
HttpWebRequest request = CreateRequest(url, "GET");
respHtml = encoding.GetString(GetData(request));
return respHtml;
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url">文件URL地址</param>
/// <param name="filename">文件保存完整路径</param>
public void DownloadFile(string url, string filename)
{
FileStream fs = null;
try
{
HttpWebRequest request = CreateRequest(url, "GET");
byte[] data = GetData(request);
fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
fs.Write(data, , data.Length);
}
finally
{
if (fs != null) fs.Close();
}
}
/// <summary>
/// 从指定URL下载数据
/// </summary>
/// <param name="url">网址</param>
/// <returns></returns>
public byte[] GetData(string url)
{
HttpWebRequest request = CreateRequest(url, "GET");
return GetData(request);
}
/// <summary>
/// 向指定URL发送文本数据
/// </summary>
/// <param name="url">网址</param>
/// <param name="postData">urlencode编码的文本数据</param>
/// <returns></returns>
public string Post(string url, string postData)
{
byte[] data = encoding.GetBytes(postData);
return Post(url, data);
}
/// <summary>
/// 向指定URL发送字节数据
/// </summary>
/// <param name="url">网址</param>
/// <param name="postData">发送的字节数组</param>
/// <returns></returns>
public string Post(string url, byte[] postData)
{
HttpWebRequest request = CreateRequest(url, "POST");
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
request.KeepAlive = true;
PostData(request, postData);
respHtml = encoding.GetString(GetData(request));
return respHtml;
}
/// <summary>
/// 向指定网址发送mulitpart编码的数据
/// </summary>
/// <param name="url">网址</param>
/// <param name="mulitpartForm">mulitpart form data</param>
/// <returns></returns>
public string Post(string url, MultipartForm mulitpartForm)
{
HttpWebRequest request = CreateRequest(url, "POST");
request.ContentType = mulitpartForm.ContentType;
request.ContentLength = mulitpartForm.FormData.Length;
request.KeepAlive = true;
PostData(request, mulitpartForm.FormData);
respHtml = encoding.GetString(GetData(request));
return respHtml;
} /// <summary>
/// 读取请求返回的数据
/// </summary>
/// <param name="request">请求对象</param>
/// <returns></returns>
private byte[] GetData(HttpWebRequest request)
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
responseHeaders = response.Headers;
//SaveCookiesToDisk(); DownloadEventArgs args = new DownloadEventArgs();
if (responseHeaders[HttpResponseHeader.ContentLength] != null)
args.TotalBytes = Convert.ToInt32(responseHeaders[HttpResponseHeader.ContentLength]); MemoryStream ms = new MemoryStream();
int count = ;
byte[] buf = new byte[bufferSize];
while ((count = stream.Read(buf, , buf.Length)) > )
{
ms.Write(buf, , count);
if (this.DownloadProgressChanged != null)
{
args.BytesReceived += count;
args.ReceivedData = new byte[count];
Array.Copy(buf, args.ReceivedData, count);
this.DownloadProgressChanged(this, args);
}
}
stream.Close();
//解压
if (ResponseHeaders[HttpResponseHeader.ContentEncoding] != null)
{
MemoryStream msTemp = new MemoryStream();
count = ;
buf = new byte[];
switch (ResponseHeaders[HttpResponseHeader.ContentEncoding].ToLower())
{
case "gzip":
GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress);
while ((count = gzip.Read(buf, , buf.Length)) > )
{
msTemp.Write(buf, , count);
}
return msTemp.ToArray();
case "deflate":
DeflateStream deflate = new DeflateStream(ms, CompressionMode.Decompress);
while ((count = deflate.Read(buf, , buf.Length)) > )
{
msTemp.Write(buf, , count);
}
return msTemp.ToArray();
default:
break;
}
}
return ms.ToArray();
}
/// <summary>
/// 发送请求数据
/// </summary>
/// <param name="request">请求对象</param>
/// <param name="postData">请求发送的字节数组</param>
private void PostData(HttpWebRequest request, byte[] postData)
{
int offset = ;
int sendBufferSize = bufferSize;
int remainBytes = ;
Stream stream = request.GetRequestStream();
UploadEventArgs args = new UploadEventArgs();
args.TotalBytes = postData.Length;
while ((remainBytes = postData.Length - offset) > )
{
if (sendBufferSize > remainBytes) sendBufferSize = remainBytes;
stream.Write(postData, offset, sendBufferSize);
offset += sendBufferSize;
if (this.UploadProgressChanged != null)
{
args.BytesSent = offset;
this.UploadProgressChanged(this, args);
}
}
stream.Close();
}
/// <summary>
/// 创建HTTP请求
/// </summary>
/// <param name="url">URL地址</param>
/// <returns></returns>
private HttpWebRequest CreateRequest(string url, string method)
{
Uri uri = new Uri(url); if (uri.Scheme == "https")
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(this.CheckValidationResult); // Set a default policy level for the "http:" and "https" schemes.
HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate);
HttpWebRequest.DefaultCachePolicy = policy; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.AllowAutoRedirect = false;
request.AllowWriteStreamBuffering = false;
request.Method = method;
if (proxy != null)
request.Proxy = proxy;
request.CookieContainer = cc;
foreach (string key in requestHeaders.Keys)
{
request.Headers.Add(key, requestHeaders[key]);
}
requestHeaders.Clear();
return request;
}
private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
/// <summary>
/// 将Cookie保存到磁盘
/// </summary>
private static void SaveCookiesToDisk()
{
string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\webclient.cookie";
FileStream fs = null;
try
{
fs = new FileStream(cookieFile, FileMode.Create);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formater.Serialize(fs, cc);
}
finally
{
if (fs != null) fs.Close();
}
}
/// <summary>
/// 从磁盘加载Cookie
/// </summary>
private static void LoadCookiesFromDisk()
{
cc = new CookieContainer();
string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\webclient.cookie";
if (!File.Exists(cookieFile))
return;
FileStream fs = null;
try
{
fs = new FileStream(cookieFile, FileMode.Open, FileAccess.Read, FileShare.Read);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
cc = (CookieContainer)formater.Deserialize(fs);
}
finally
{
if (fs != null) fs.Close();
}
}
} /// <summary>
/// 对文件和文本数据进行Multipart形式的编码
/// </summary>
public class MultipartForm
{
private Encoding encoding;
private MemoryStream ms;
private string boundary;
private byte[] formData;
/// <summary>
/// 获取编码后的字节数组
/// </summary>
public byte[] FormData
{
get
{
if (formData == null)
{
byte[] buffer = encoding.GetBytes("--" + this.boundary + "--\r\n");
ms.Write(buffer, , buffer.Length);
formData = ms.ToArray();
}
return formData;
}
}
/// <summary>
/// 获取此编码内容的类型
/// </summary>
public string ContentType
{
get { return string.Format("multipart/form-data; boundary={0}", this.boundary); }
}
/// <summary>
/// 获取或设置对字符串采用的编码类型
/// </summary>
public Encoding StringEncoding
{
set { encoding = value; }
get { return encoding; }
}
/// <summary>
/// 实例化
/// </summary>
public MultipartForm()
{
boundary = string.Format("--{0}--", Guid.NewGuid());
ms = new MemoryStream();
encoding = Encoding.Default;
}
/// <summary>
/// 添加一个文件
/// </summary>
/// <param name="name">文件域名称</param>
/// <param name="filename">文件的完整路径</param>
public void AddFlie(string name, string filename)
{
if (!File.Exists(filename))
throw new FileNotFoundException("尝试添加不存在的文件。", filename);
FileStream fs = null;
byte[] fileData = { };
try
{
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
fileData = new byte[fs.Length];
fs.Read(fileData, , fileData.Length);
this.AddFlie(name, Path.GetFileName(filename), fileData, fileData.Length);
}
catch (Exception)
{
throw;
}
finally
{
if (fs != null) fs.Close();
}
}
/// <summary>
/// 添加一个文件
/// </summary>
/// <param name="name">文件域名称</param>
/// <param name="filename">文件名</param>
/// <param name="fileData">文件二进制数据</param>
/// <param name="dataLength">二进制数据大小</param>
public void AddFlie(string name, string filename, byte[] fileData, int dataLength)
{
if (dataLength <= || dataLength > fileData.Length)
{
dataLength = fileData.Length;
}
StringBuilder sb = new StringBuilder();
sb.AppendFormat("--{0}\r\n", this.boundary);
sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\n", name, filename);
sb.AppendFormat("Content-Type: {0}\r\n", this.GetContentType(filename));
sb.Append("\r\n");
byte[] buf = encoding.GetBytes(sb.ToString());
ms.Write(buf, , buf.Length);
ms.Write(fileData, , dataLength);
byte[] crlf = encoding.GetBytes("\r\n");
ms.Write(crlf, , crlf.Length);
}
/// <summary>
/// 添加字符串
/// </summary>
/// <param name="name">文本域名称</param>
/// <param name="value">文本值</param>
public void AddString(string name, string value)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("--{0}\r\n", this.boundary);
sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n", name);
sb.Append("\r\n");
sb.AppendFormat("{0}\r\n", value);
byte[] buf = encoding.GetBytes(sb.ToString());
ms.Write(buf, , buf.Length);
}
/// <summary>
/// 从注册表获取文件类型
/// </summary>
/// <param name="filename">包含扩展名的文件名</param>
/// <returns>如:application/stream</returns>
private string GetContentType(string filename)
{
Microsoft.Win32.RegistryKey fileExtKey = null; ;
string contentType = "application/stream";
try
{
fileExtKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Path.GetExtension(filename));
contentType = fileExtKey.GetValue("Content Type", contentType).ToString();
}
finally
{
if (fileExtKey != null) fileExtKey.Close();
}
return contentType;
}
}

Http 数据操作的更多相关文章

  1. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  2. hive数据操作

    mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files ...

  3. Dapper 数据操作框架

    数据操作DapperFrom NuGet:Install-Package DapperorInstall-Package Dapper.StrongName微型ORM:PetaPoco获得PetaPo ...

  4. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  5. coreData数据操作

    // 1. 建立模型文件// 2. 建立CoreDataStack// 3. 设置AppDelegate 接着 // // CoreDataStack.swift // CoreDataStackDe ...

  6. Entity Framework 5.0系列之数据操作

    Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...

  7. 数据操作语言DML与运算符

    数据操作语言DML(添加,修改,删除) 1.添加数据 insert into insert into 表名 (字段列表) values (值列表),值列表要和字段列表按顺序匹配. insert int ...

  8. SQL不同服务器数据库之间的数据操作整理(完整版)

    ---------------------------------------------------------------------------------- -- Author : htl25 ...

  9. C#利用SqlDataAdapte对DataTable进行批量数据操作

    C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...

  10. 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

随机推荐

  1. Firebase Chat (firebase 实现web聊天室)

    基于firebase + cloud Function 实现web聊天(demo版) 知识点: 使用Firebase SDK创建Google Cloud功能. 触发云功能基于Auth,云存储和Clou ...

  2. web框架链接

    django系列教程(优):https://www.cnblogs.com/feixuelove1009/p/5823135.html

  3. 使用 ASP.NET Core 的 gRPC 服务

    将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...

  4. Pycharm有必要改的几个默认设置项以及快捷键

    最近在用Pycharm学习Python的时候,总有两个地方感觉不是很舒服,比如调用方法的时候区分大小写(thread就不会出现Thread,string就不会出现String)等,这让我稍稍有点不舒服 ...

  5. JSON和AJAX基础

    前一段时间做老师留的企业图谱作业,和查询功能都需要用到AJAX .然后做爬虫的时候发现好多网站都用到的是页面的局部刷新,也就是发送的AJAX请求.就去学了一下.简单总结 什么是 JSON ? JSON ...

  6. C#int类型 转Byte[]

    方法1:使用左移和右移 int转化为byte[]:   public  byte[] intToBytes(int value)         {             byte[] src = ...

  7. 【ES6 】var/let/const的区别

    var 声明变量 没有区级作用域 可以预解析 可以重复定义 声明的全局变量属于顶层对象(window)的属性 let 声明变量 有块级作用域 没有预解析 不可以重复定义 声明的全局变量不属于顶层对象( ...

  8. centos6.4升级openssh7.4p1

    Centos6.4版本yum升级openssh版本最高到5.3,想要升级到更高的版本需要重新编译 一.查看当前openssh版本: [root@localhost ~]# ssh -VOpenSSH_ ...

  9. 记录旧手机(米6)安装Linux(Ubuntu16.04)踩过的坑

    旧的小米6在抽屉吃灰半年,一直没想好要怎么处理,于是就想着安装Linux. 完整教程来自https://blog.csdn.net/Greepex/article/details/85333027 原 ...

  10. bootstrap和JS实现下拉菜单

    // bootstrap下拉菜单 <div class="btn-group"> <button id="button_text" type= ...