相关文章
企通互联用HTML和CSS写出漂亮正规的BLOG
网站建设ASP.NET中为DataGrid添加合计字段
北京网页设计动易原始模板的换肤
网站制作HTML语言剖析(十三)其他标记
北京网站建设CSS语法手册(五)颜色和背景属性
网页设计target="_blank"不符合标准?
网页设计自己动手制作活动菜单条
北京网站设计Ultradev实例教程:3.4 向数据库添加纪录
北京网页设计Dreamweaver基础视频教程18 使用表单
企通互联DW中如何使用Library
品牌理念
北京网站建设最佳合作伙伴
北京网站建设专家企通互联
竭诚为您提供网站建设服务!
友好连接
文章搜索
你的位置:首页 >> 网站制作 >> 北京网站制作北京网站设计用 WebClient.UploadData 方法 上载文件数据
北京网站制作北京网站设计用 WebClient.UploadData 方法 上载文件数据
假如某网站有个表单,例如(url: http://localhost/login.aspx): 北京网页设计
帐号 北京网站制作
密码 网站建设
网站设计
北京网站建设我们需要在程序中提交数据到这个表单,对于这种表单,我们可以使用 WebClient.UploadData 方法来实现,将所要上传的数据拼成字符即可,程序很简单: 网站建设
网站建设
string uriString = "http://localhost/login.aspx"; 网站设计
// 创建一个新的 WebClient 实例. 北京网站设计
WebClient myWebClient = new WebClient(); 北京网站设计 北京网站制作
string postData = "Username=admin&Password=admin"; 北京网页设计
// 注意这种拼字符串的ContentType 网站制作
myWebClient.Headers.Add("Content-Type","application/x-www-form-urlencoded"); 北京网页设计
// 转化成二进制数组 网页设计
byte[] byteArray = Encoding.ASCII.GetBytes(postData); 企通互联
// 上传数据,并获取返回的二进制数据. 北京网站设计
byte[] responseArray = myWebClient.UploadData(uriString,"POST",byteArray); 北京网站制作
企通互联
网站设计
对于文件上传类的表单,例如(url: http://localhost/uploadFile.aspx): 北京网站建设
文件 北京网站制作
北京网站制作
对于这种表单,我们可以使用 网站设计
String uriString = "http://localhost/uploadFile.aspx"; 网站建设
企通互联
// 创建一个新的 WebClient 实例. 北京网站建设
WebClient myWebClient = new WebClient(); 网站建设
网站设计
string fileName = @"C:upload.txt"; 网页设计
北京网站建设
// 直接上传,并获取返回的二进制数据. 企通互联
byte[] responseArray = myWebClient.UploadFile(uriString,"POST",fileName); 网站建设
企通互联
北京网页设计
还有一种表单,不仅有文字,还有文件,例如(url: http://localhost/uploadData.aspx): 网站制作
文件名 北京网页设计
文件 北京网页设计
网页设计
对于这种表单,似乎前面的两种方法都不能适用,对于第一种方法,不能直接拼字符串,对于第二种,我们只能传文件,重新回到第一个方法,注意参数: 网站制作
public byte[] UploadData( 网站设计
string address, 网站建设
string method, 北京网站建设
byte[] data 企通互联
); 北京网站建设
在第一个例子中,是通过拼字符串来得到byte[] data参数值的,对于这种表单显然不行,反过来想想,对于uploadData.aspx这样的程序来说,直接通过网页提交数据,后台所获取到的流是什么样的呢?(在我以前的一篇blog中,曾分析过这个问题:asp无组件上传进度条解决方案),最终的数据如下: 北京网站制作
网站设计
-----------------------------7d429871607fe 北京网站制作
Content-Disposition: form-data; name="file1"; filename="G:homepage.txt" 企通互联
Content-Type: text/plain 网站设计
宝玉:http://www.webuc.net 北京网站建设
-----------------------------7d429871607fe 网站建设
Content-Disposition: form-data; name="filename" 企通互联
default filename 网站制作
-----------------------------7d429871607fe-- 网页设计
网站建设
北京网站设计
所以只要拼一个这样的byte[] data数据Post过去,就可以达到同样的效果了。但是一定要注意,对于这种带有文件上传的,其ContentType是不一样的,例如上面的这种,其ContentType为"multipart/form-data; boundary=---------------------------7d429871607fe"。有了ContentType,我们就可以知道boundary(就是上面的"---------------------------7d429871607fe"),知道boundary了我们就可以构造出我们所需要的byte[] data了,最后,不要忘记,把我们构造的ContentType传到WebClient中(例如:webClient.Headers.Add("Content-Type", ContentType);)这样,就可以通过WebClient.UploadData 方法上载文件数据了。 企通互联
网站制作
具体代码如下: 网站设计
生成二进制数据类的封装 网页设计
网站建设
using System; 网页设计
using System.Web; 网站制作
using System.IO; 北京网站建设
using System.Net; 网站设计
using System.Text; 北京网站设计
using System.Collections; 网页设计
北京网站建设
namespace UploadData.Common 北京网页设计
...{ 网站制作
/**//// <summary> 网站设计
/// 创建WebClient.UploadData方法所需二进制数组 网页设计
/// </summary> 企通互联
public class CreateBytes 网页设计
...{ 网站建设
Encoding encoding = Encoding.UTF8; 北京网页设计
北京网站设计
/**//// <summary> 北京网站建设
/// 拼接所有的二进制数组为一个数组 北京网站建设
/// </summary> 北京网站建设
/// <param name="byteArrays">数组</param> 北京网站设计
/// <returns></returns> 北京网页设计
/// <remarks>加上结束边界</remarks> 网站制作
public byte[] JoinBytes(ArrayList byteArrays) 北京网站设计
...{ 网站设计
int length = 0; 北京网站建设
int readLength = 0; 网站制作
网站制作
// 加上结束边界 北京网站建设
string endBoundary = Boundary + "--rn"; //结束边界 网站制作
byte[] endBoundaryBytes = encoding.GetBytes(endBoundary); 网站建设
byteArrays.Add(endBoundaryBytes); 北京网站建设
北京网站设计北京网站制作
foreach(byte[] b in byteArrays) 企通互联
...{ 企通互联
length += b.Length; 企通互联
} 网站建设
byte[] bytes = new byte[length]; 网站设计
网站制作
// 遍历复制 北京网站建设
// 北京网站制作
foreach(byte[] b in byteArrays) 北京网页设计
...{ 北京网站建设
b.CopyTo(bytes, readLength); 北京网站设计
readLength += b.Length; 北京网站制作
} 北京网站建设
北京网站制作
return bytes; 北京网页设计 北京网页设计
} 北京网站制作
北京网页设计
public bool UploadData(string uploadUrl, byte[] bytes, out byte[] responseBytes) 北京网站建设
...{ 网站设计
WebClient webClient = new WebClient(); 网站设计
webClient.Headers.Add("Content-Type", ContentType); 网页设计
北京网站建设
try 北京网页设计
...{ 北京网站制作
responseBytes = webClient.UploadData(uploadUrl, bytes); 网页设计
return true; 北京网站建设
} 北京网站建设
catch (WebException ex) 北京网页设计
...{ 网站制作
Stream resp = ex.Response.GetResponseStream(); 北京网站建设
responseBytes = new byte[ex.Response.ContentLength]; 北京网站制作
resp.Read(responseBytes, 0, responseBytes.Length); 网站建设网站建设
} 网站建设
return false; 北京网站建设
} 北京网站设计
北京网站设计
网站设计
网站设计
/**//// <summary> 企通互联
/// 获取普通表单区域二进制数组 北京网站建设
/// </summary> 网站建设
/// <param name="fieldName">表单名</param> 企通互联
/// <param name="fieldValue">表单值</param> 企通互联
/// <returns></returns> 北京网站制作
/// <remarks> 北京网站建设
/// -----------------------------7d52ee27210a3crnContent-Disposition: form-data; name="表单名"rnrn表单值rn 北京网站建设
/// </remarks> 北京网站建设
public byte[] CreateFieldData(string fieldName, string fieldValue) 北京网站建设
...{ 网站建设
string textTemplate = Boundary + "rnContent-Disposition: form-data; name="{0}"rnrn{1}rn"; 网站设计
string text = String.Format(textTemplate, fieldName, fieldValue); 北京网站制作
byte[] bytes = encoding.GetBytes(text); 北京网页设计
return bytes; 网站设计
} 北京网站设计
网站设计
北京网站设计
/**//// <summary> 网站设计
/// 获取文件上传表单区域二进制数组 北京网站设计
/// </summary> 网站设计
/// <param name="fieldName">表单名</param> 网站建设
/// <param name="filename">文件名</param> 北京网站建设
/// <param name="contentType">文件类型</param> 北京网站建设
/// <param name="contentLength">文件长度</param> 北京网页设计
/// <param name="stream">文件流</param> 网站设计
/// <returns>二进制数组</returns> 网站制作
public byte[] CreateFieldData(string fieldName, string filename,string contentType, byte[] fileBytes) 网站设计
...{ 北京网站制作
string end = "rn"; 网站设计
string textTemplate = Boundary + "rnContent-Disposition: form-data; name="{0}"; filename="{1}"rnContent-Type: {2}rnrn"; 北京网站建设
网站设计
// 头数据 企通互联
string data = String.Format(textTemplate, fieldName, filename, contentType); 北京网站制作 网站制作
byte[] bytes = encoding.GetBytes(data); 网页设计
网页设计
企通互联
北京网站建设
// 网页设计尾数据 网站设计
byte[] endBytes = encoding.GetBytes(end); 企通互联
北京网站制作
// 合成后的数组 企通互联
byte[] fieldData = new byte[bytes.Length + fileBytes.Length + endBytes.Length]; 网站设计
网站建设
bytes.CopyTo(fieldData, 0); // 企通互联头数据 网页设计
fileBytes.CopyTo(fieldData, bytes.Length); // 文件的二进制数据 网站建设
endBytes.CopyTo(fieldData, bytes.Length + fileBytes.Length); // rn 网站设计
网站设计
return fieldData; 北京网站制作
} 网站建设
网站制作
北京网站制作
属性#region 属性 北京网站制作
public string Boundary 北京网站建设
...{ 北京网页设计
get 北京网页设计
...{ 北京网页设计
string[] bArray, ctArray; 企通互联
string contentType = ContentType; 网站设计
ctArray = contentType.Split(';'); 北京网站设计
if (ctArray[0].Trim().ToLower() == "multipart/form-data") 网站设计
...{ 企通互联
bArray = ctArray[1].Split('='); 网站设计
return "--" + bArray[1]; 北京网站建设
} 北京网页设计
return null; 网页设计
} 企通互联
} 网页设计
北京网站建设
public string ContentType 北京网页设计
...{ 北京网站制作
get ...{ 网站设计
if (HttpContext.Current == null) 企通互联
...{ 北京网页设计
return "multipart/form-data; boundary=---------------------------7d5b915500cee"; 网站制作
} 北京网页设计
return HttpContext.Current.Request.ContentType; 网站设计
} 网站设计
} 网页设计
#endregion 网站设计
} 企通互联
} 网站建设