【问题标题】:HtmlUnit: Determine file sizeHtmlUnit:确定文件大小
【发布时间】:2017-11-26 13:16:26
【问题描述】:

我正在通过 HtmlUnit 从网上下载一个文件。 这就是我的(工作)代码的样子:

Page dlPage = client.getPage(url);
FileOutputStream fos = new FileOutputStream(destinationFile);
try
{
  IOUtils.copy(dlPage.getWebResponse().getContentAsStream(), fos);
}
catch (Exception ex)
{
  ex.printStackTrace();
}
finally
{
  fos.close();
}

我想显示下载进度。因此我需要知道文件大小。 Content-Length 标头由服务器发送,但问题是我可以在文件下载后读取标头。 getPage() 方法在文件下载之前一直处于阻塞状态。

有什么方法可以先在 HtmlUnit 中读取响应标头,然后再读取内容?或者有没有其他方法可以解决这个问题?

谢谢!

【问题讨论】:

    标签: java htmlunit


    【解决方案1】:

    您可以使用URLConnectiongetContentLength()方法获取连接建立时的长度。

    【讨论】:

    • 感谢您的回答。但问题是dlPage.getWebResponse().getContentLength()在内容下载后返回内容长度。
    • 是的。那是因为 Page 在实例化时会下载页面内容。这就是为什么我提到了 URL CONNECTION 的 getContentLength 方法。使用 URLConnection 创建到相同 url 的连接并通过它获取内容长度。它将远程获取内容长度和标题(如果需要)。
    • 如何在我的示例中获取 UrlConnection?我用我刚刚尝试过的方式发布了一个答案,它奏效了。这是你的意思吗?
    • URL url = new URL("google.com"); URLConnection urlConnection = url.openConnection(); urlConnection.getContentLength(); 你可以这样做。
    • 好的,现在我明白你的意思了。问题是我需要在页面上登录。这就是为什么我需要 HtmlUnit 来填写登录表单并进行身份验证的原因。使用普通的 java 解决方案,这是行不通的。但对于不需要登录的网站来说,这将是一个更好的解决方案。
    【解决方案2】:

    好的,我想出了一种方法来让它工作:在下载之前,我向服务器发送一个 HEAD 请求,以便我可以使用响应来读取内容长度:

    WebRequest wr = new WebRequest(new URL(url), HttpMethod.HEAD);
    Page wrPage = client.getPage(wr);
    long contentLength = Integer.valueOf(wrPage.getWebResponse().getResponseHeaderValue("Content-Length"));
    System.out.println(contentLength);
    

    【讨论】:

    • 请注意 - 如果响应是静态内容,这将起作用。在动态内容的情况下 - 服务器代码应该处理“头”请求,并且应该有一种快速计算内容大小的方法。在大多数情况下,计算内容大小的唯一方法是生成整个页面内容。因此谨慎使用。如果您将 HTMLUnit 用作负载测试脚本的一部分,则会影响结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2014-06-13
    • 2011-04-19
    • 2015-03-06
    相关资源
    最近更新 更多