【问题标题】:use jsoup to download file, response bodyStream only can get one megabyte file downloaded使用jsoup下载文件,响应bodyStream只能下载一兆文件
【发布时间】:2018-06-28 02:24:50
【问题描述】:

我使用jsoup从网站下载一些文件,通过使用下面的代码,我可以得到文件下载响应体

 private HttpConnection.Response getResponse3(String url, String resource_url) throws IOException {
    Response resource_download;
    resource_download = Jsoup.connect(resource_url)
            .method(Method.GET).header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")
            .header("Upgrade-Insecure-Requests", "1")
            .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
            .header("Accept-Encoding", "gzip, deflate, br")
            .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
            .header("Referer", url)
            .cookie("CASTGC", "TGT-1479-kzRU5mnAuwVmsfJFcaHDT1iIrD6V7C1kUvi6IMi")
            .followRedirects(true)
            .ignoreContentType(true)
            .execute();
    return resource_download;
}

然后我只是将响应对象返回到另一种方法以获取文件下载。该方法如下所示:

        File file = new File(downloadFilePath + fileName);
        BufferedInputStream inputStream = response.bodyStream();
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        inputStream.close();
        fos.close();

但是,我只能下载一兆字节的文件,大约是 70M左右。所以我想知道为什么这些代码不能正常工作?它出什么问题了。

我也看了一些建议说最好使用HttpURLConnection来下载文件而不是jsoup,但我这样做的原因是因为我认为jsoup可以携带cookies和浏览器的其他一些信息来获取文件下载流,而如果我向文件 url 发送另一个请求,我必须再次写入这些信息和 cookie。如果没有这些信息,服务器会检测到我,他们可能会拒绝我的访问。

【问题讨论】:

  • 你的文件是text吗?
  • 不,这是普通文件,.rar 或 .zip 等文件

标签: java jsoup response fileinputstream


【解决方案1】:

.execute() 之前使用.maxBodySize(0)https://jsoup.org/apidocs/org/jsoup/Connection.html#maxBodySize-int-

【讨论】:

  • 是的,我认为这是个好主意。但它会一次将所有最大大小的数据加载到我的计算机内存中吗?如果文件太大了 100 到 200 兆字节怎么办,对我的电脑内存是不是很大的挑战?
  • 顺便说一句,在我得到响应之前,我真的不知道文件有多大。这真的很烦人。
  • 解析器有两种类型:DOM 和 SAX。 DOM 像 Jsoup 一样一次性解析整个文件。如果您想避免将大文件加载到内存中,那么您需要 SAX 类型的解析器。它在读取文件时解析文件。
猜你喜欢
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多