|
最近有个项目需要从网络上下载网页信息和文件,并且需要登录后才能下载,所以做了个下载的通用类,供大家参考。
这个是文件下载类: 复制代码 代码如下: using System; using System.IO; using System.Net; using System.Web;
public class SRWebClient { CookieContainer cookie; public SRWebClient() { cookie = new CookieContainer(); }
/// <TgData> /// <Alias>下载Web源代码</Alias> /// </TgData> public string DownloadHtml(string URL) { HttpWebRequest request = HttpWebRequest.Create(URL) as HttpWebRequest; request.CookieContainer = cookie; request.AllowAutoRedirect = false;
WebResponse res = request.GetResponse(); string r = "";
StreamReader S1 = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default); try { r = S1.ReadToEnd(); } catch (Exception er) { Log l = new Log(); l.writelog("下载Web错误", er.ToString()); } finally { res.Close(); S1.Close(); }
return r; }
/// <TgData> /// <Alias>下载文件</Alias> /// </TgData> public long DownloadFile(string FileURL, string FileSavePath) { long Filelength = 0; HttpWebRequest req = HttpWebRequest.Create(FileURL) as HttpWebRequest;
req.CookieContainer = cookie; req.AllowAutoRedirect = true;
HttpWebResponse res = req.GetResponse() as HttpWebResponse; System.IO.Stream stream = res.GetResponseStream(); try { Filelength = res.ContentLength;
byte[] b = new byte[512];
int nReadSize = 0; nReadSize = stream.Read(b, 0, 512);
System.IO.FileStream fs = System.IO.File.Create(FileSavePath); try { while (nReadSize > 0) { fs.Write(b, 0, nReadSize); nReadSize = stream.Read(b, 0, 512); } } finally { fs.Close(); } } catch (Exception er) { Log l = new Log(); l.writelog("下载文件错误", er.ToString()); } finally { res.Close(); stream.Close(); }
return Filelength; }
/// <TgData> /// <Alias>提交数据</Alias> /// </TgData> public void Request(string RequestPageURL, RequestData Data) { string StrUrl = RequestPageURL; HttpWebRequest request = HttpWebRequest.Create(StrUrl) as HttpWebRequest; HttpWebResponse response;
string postdata = Data.GetData(); request.Referer = RequestPageURL; request.AllowAutoRedirect = false; request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)"; request.CookieContainer = cookie;
Uri u = new Uri(StrUrl);
if (postdata.Length > 0) //包含要提交的数据 就使用Post方式 { //作为表单请求 request.ContentType = "application/x-www-form-urlencoded"; //方式就是Post request.Method = "POST";
//把提交的数据换成字节数组 Byte[] B = System.Text.Encoding.Default.GetBytes(postdata); request.ContentLength = B.Length;
Stream SW = request.GetRequestStream(); //开始提交数据 SW.Write(B, 0, B.Length); SW.Close(); }
response = request.GetResponse() as HttpWebResponse; response.Close(); } }
这个是提交的数据类: 复制代码 代码如下: using System.Collections; using System.IO;
public class RequestData { ArrayList arr = new ArrayList(); public RequestData() {
}
public string GetData() { string r = "";
for (int i = 0; i < arr.Count; i++) { data d = (data) arr[i]; if (r.Length > 0) r += "&"; r += d.Field + "=" + d.Value; } return r; }
public void AddField(string Field, string Value) { data a = new data(); a.Field = Field; a.Value = Value;
arr.Add(a); }
struct data { public string Field, Value; } }
代码贴完了,下面是测试代码,因为有些数据涉及到客户的资料,故隐去 复制代码 代码如下: using NUnit.Framework;
[TestFixture] public class TestWeb { [Test] public void testDownSEOrder() { RequestData data = new RequestData(); data.AddField("name", "abc"); data.AddField("password", "121");
SRWebClient web = new SRWebClient(); web.Request("http://127.0.0.1/login.asp", data);
string s = web.DownloadHtml("http://127.0.0.1/dingdan.asp"); System.Console.WriteLine(s); }
[Test] public void testDownFile() { RequestData data = new RequestData(); data.AddField("name", "aaa"); data.AddField("password", "bbb");
SRWebClient web = new SRWebClient(); web.Request("http://127.0.0.1/login.asp", data);
web.DownloadFile("http://127.0.0.1/download.asp?fileid=1", @"c:\a.txt"); } }
|
|