【问题标题】:Download file from URL with parameters and authentication required从 URL 下载文件,需要参数和身份验证
【发布时间】:2018-10-11 16:05:43
【问题描述】:

很抱歉打扰您,但是我尝试了一个多星期,没有找到简单有效的方法来实现这个目标,所以我在这里寻求您的帮助。我的工作中有一个经常性的任务,遵循以下步骤:

  1. 访问我的公司网站;
  2. 登录;
  3. 进行搜索;
  4. 从搜索结果页面下载 KMZ 文件。

我每周都这样做,每次需要下载超过 100 个文件,你知道吗?

我有一个包含我需要的所有结果的列表,所以我在 c# 中创建了一个应用程序来自动化这个过程,但是当文件下载时它不是正确的类型 (KMZ) 并且它的内容是登录页面源代码。发生这种情况是因为我没有正确的文件名,它是由 URL 中的一些参数加载的,例如 https://mycompanywebsite.org/files/fileViewServlet?Parameter1=abx&Parameter2=xyz&Parameter3=123

我就是这么做的。

//Download the file for the returned list
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    using (WebClient client = new WebClient())
    {
        //client.Credentials = new NetworkCredential("username", "password");
        String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("myusernae" + ":" + "mypassword"));
        client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";

        try
        {
            //Download the KMZ
            client.Proxy = null;
            client.QueryString.Add("parameter1", "value");
            client.QueryString.Add("parameter2", "value");
            client.QueryString.Add("parameter3", "value");
            outputFileName = "File_Name_" + row.Cells["FieldTitle"].Value.ToString() + ".kmz";
            client.DownloadFile("https://mycompanywebsite.org/files/fileViewServlet?", strTargetFolder + nomeArquivoEstaca);


        }
        catch (WebException ex)
        {

            MessageBox.Show(ex.ToString());
        }
    }

}

如果您有任何样本可以帮助我实现这一目标,我将不胜感激。

非常感谢。

【问题讨论】:

  • 您确定身份验证没有失败吗?基本身份验证是该站点的实际身份验证方法吗?请注意,由于您使用的是 QueryParameters,因此 URI 中的最终 ? 不应该存在。此外,您应该使用NameValueCollection 并将您的参数添加到其中。由于您尝试从同一地址下载更多文件,因此您可以使用WebClient.BaseAddress 功能。
  • 我觉得认证没问题。问题是下载的文件。正如我所说,这不是正确的文件。在我登录网站并搜索我需要的内容后手动执行此操作,结果页面会返回一个 ID 号。这个数字用于链接下载我需要的文件。它看起来像这样:cdol.lds.org/cdol/servlet/…(身份证号)。我需要将此 URL 生成的文件保存在我计算机上的预定义文件夹中。你能帮忙编辑我的代码以适应你的建议吗?
  • 这不是你写的:文件(...)不正确(...)它的内容是登录页面源代码。您是否返回登录页面,或包含您提到的ID 的页面?如果是登录页面,则认证失败。如果是带有此ID 的页面,请提取信息并使用它构建查询。
  • 所以,我可以使用 webbrowser 控件进行身份验证,因为我认为身份验证是可以的,但是这里我们使用 WebClient 可能没有进行身份验证。当我单击该链接(手动)时,正在下载 KMZ 文件,但在我的应用程序中下载的是重命名为 KMZ 的登录页面的源代码,而不是我需要的文件,你知道吗?
  • WebBrowser 不是WebClient。您可以使用 WebBrowser 进行身份验证这一事实与您使用 WebClient 获得的结果无关。您链接的页面正在使用 Web 表单身份验证。您正在尝试使用basic 身份验证登录。这两种方法是完全不兼容的。在 SO/Google 上搜索 HttpClient Web Form Authentication

标签: c# winforms httpwebrequest webclient httpwebresponse


【解决方案1】:

没有人有办法让我达到这个目标吗?这里的主要问题是我无法访问 URL 上的文件名。正如我所看到的,当调用具有该参数的 URL 时,该文件是从服务器操作下载的。我可以使用某些功能来查找文件名并使用它在 c# windows 或 Web 应用程序中下载它吗?

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 2014-07-09
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多