黑暗角落

黑暗角落
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

login

Posted on 2005-12-24 10:27  gz.net  阅读(391)  评论(0编辑  收藏  举报
最近有个项目需要从网络上下载网页信息和文件,并且需要登录后才能下载,所以做了个下载的通用类,供大家参考。

这个是文件下载类:
using System;
    
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="";
                        
            System.IO.StreamReader S1 
= new System.IO.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"//作为表单请求
                request.Method = "POST";        //方式就是Post

                
//把提交的数据换成字节数组
                Byte [] B = System.Text.Encoding.Default.GetBytes(postdata);
                request.ContentLength 
= B.Length;

                System.IO.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");
            
        }

    }