通过登录从Web下载C#下载文件

时间:2013-02-07 19:03:15

标签: c# http

我已经可以使用此代码重定向(我正在保存cookie)登录网页

   CookieCollection cookies = new CookieCollection();
        HttpWebRequest cookieRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/"); 
        cookieRequest.CookieContainer = new CookieContainer();
        cookieRequest.CookieContainer.Add(cookies);
        HttpWebResponse cookieResponse = (HttpWebResponse)cookieRequest.GetResponse();
        cookies = cookieResponse.Cookies;

        string postData = "name=********&password=*********&submit=submit";
        HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/");
        loginRequest.CookieContainer = new CookieContainer();
        loginRequest.CookieContainer.Add(cookies);
        loginRequest.Method = WebRequestMethods.Http.Post;
        loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        loginRequest.AllowWriteStreamBuffering = true;
        loginRequest.ProtocolVersion = HttpVersion.Version11;
        loginRequest.AllowAutoRedirect = true;
        loginRequest.ContentType = "application/x-www-form-urlencoded";

        byte[] byteArray = Encoding.ASCII.GetBytes(postData);
        loginRequest.ContentLength = byteArray.Length;
        Stream newStream = loginRequest.GetRequestStream(); //open connection
        newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
        newStream.Close();

这很好,但我需要从那里下载.xls文件,它位于这里(例如)

https://www.loginpage.com/export_excel.php?export_type=list

为此我尝试了这段代码

     HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create("https://www.loginpage.com/export_excel.php?export_type=list");
        HttpWebResponse ws = (HttpWebResponse)wr.GetResponse();
        Stream str = ws.GetResponseStream();
        byte[] inBuf = new byte[100000];
        int bytesReadTotal = 0;
        string path = @"d:\test.xlsx";
        FileStream fstr = new FileStream(path, FileMode.Create, FileAccess.Write);
        while (true)
        {
            int n = str.Read(inBuf, 0, 100000);
            if ((n == 0) || (n == -1))
            {
                break;
            }

            fstr.Write(inBuf, 0, n);

            bytesReadTotal += n;
        }
        str.Close();
        fstr.Close();

但它不起作用,现在我坚持这个

        string dLink = "https://www.loginpage.com/export_excel.php?export_type=list";
        HttpWebRequest fileRequest = (HttpWebRequest)HttpWebRequest.Create(dLink);
        fileRequest.CookieContainer = new CookieContainer();
        fileRequest.CookieContainer.Add(cookies);
        fileRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        HttpWebResponse fileResponse = (HttpWebResponse)fileRequest.GetResponse();

        for (int i = 0; i < fileResponse.Headers.Count; ++i)
        richTextBox1.Text += "\nHeader Name: " + fileResponse.Headers.Keys[i] + ", Value :" + fileResponse.Headers[i];

当然没有下载文件。我现在正试图获取标题,以便了解我从网络上获得的内容?我已经使用我的脚本从rghost或filehippo这样的文件页面下载了一些文件,但是这个文件没有用。

2 个答案:

答案 0 :(得分:5)

这应该可以胜任!

        CookieContainer cookieJar = new CookieContainer();
        CookieAwareWebClient http = new CookieAwareWebClient(cookieJar);

        string postData = "name=********&password=*********&submit=submit";
        string response = http.UploadString("https://www.loginpage.com/", postData);

        // validate your login! 

        http.DownloadFile("https://www.loginpage.com/export_excel.php?export_type=list", "my_excel.xls");

我使用了CookieAwareWebClient

public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; }
    public Uri Uri { get; set; }

    public CookieAwareWebClient()
        : this(new CookieContainer())
    {
    }

    public CookieAwareWebClient(CookieContainer cookies)
    {
        this.CookieContainer = cookies;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = this.CookieContainer;
        }
        HttpWebRequest httpRequest = (HttpWebRequest)request;
        httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        return httpRequest;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];

        if (setCookieHeader != null)
        {
            //do something if needed to parse out the cookie.
            if (setCookieHeader != null)
            {
                Cookie cookie = new Cookie(); //create cookie
                this.CookieContainer.Add(cookie);
            }
        }
        return response;
    }
}

Source & Credit for : CookieAwareWebClient

答案 1 :(得分:0)

如果客户帐户已经是该网站的有效用户,您只需在下载前使用默认凭据,就像这样..

WebClient Client=new WebClient();
Client.UseDefaultCredentials=true;
Client.DownloadFile(url, destination);
相关问题