使用WebClient登录和下载文件

时间:2013-05-21 01:32:24

标签: .net vb.net webclient webclient-download

我发现了这样做的不同例子,但未能使它们的任何组合起作用。

基本上,我有一个可以从Web链接生成文档的Intranet系统,我知道要下载哪些文档。我能够生成我想要下载的链接列表,但是我遇到了在程序中对系统进行身份验证的问题。我一直收到401错误:

Public Shared Sub DownloadFiles(_tool As Tool)
    Dim links As List(Of String) = GetJiraLinks(_tool)

    Dim downloader As New WebClient

    ' Initialize the client
    Dim reqParm As New Specialized.NameValueCollection

    reqParm.Add("os_username", "user")
    reqParm.Add("os_password", "pass")
    reqParm.Add("os_destination", "/secure/")

    downloader.Credentials = New NetworkCredential("user", "pass")

    Dim uploadLocation As String = My.Settings.jiraLocation & "login.jsp"

    'downloader.Headers.Add("Content-Type", "application/x-www-form-urlencoded")

    Dim responseBytes = downloader.UploadValues(uploadLocation, "POST", reqParm)

    Dim responseBody = (New Text.UTF8Encoding).GetString(responseBytes)

    Dim workingDir As String = CreateWorkingDir()

    For Each link As String In links
        Dim tempUri As New Uri(link)

        Dim localpath As String = workingDir & "\" & System.IO.Path.GetFileName(tempUri.LocalPath)

        downloader.DownloadFile(tempUri, localpath)
    Next
End Sub

1 个答案:

答案 0 :(得分:1)

我想我会发布一个完整的解决方案示例。许多其他帖子链接到cookie感知的Web客户端(How can I get the WebClient to use Cookies?)但未能显示它的实际效果。这是我的:

Public Shared Sub DownloadFiles(_tool As Tool)
    Dim links As List(Of String) = GetJiraLinks(_tool)

    Dim downloader As New CookieAwareWebClient

    ' Start by requesting the page.

    Dim loginPage As String = My.Settings.jiraLocation & "login.jsp"

    ' Initialize the client
    Dim reqParm As New Specialized.NameValueCollection

    reqParm.Add("os_username", "user")
    reqParm.Add("os_password", "pass")
    reqParm.Add("os_destination", "/secure/")

    Dim responseBytes = downloader.UploadValues(loginPage, "POST", reqParm)

    Dim responseBody = (New Text.UTF8Encoding).GetString(responseBytes)

    Dim workingDir As String = CreateWorkingDir()

    For Each link As String In links
        Dim tempUri As New Uri(link)

        Dim localpath As String = workingDir & "\" & System.IO.Path.GetFileName(tempUri.LocalPath)

        downloader.DownloadFile(tempUri, localpath)
    Next
End Sub