3

我正在使用如何使用 Java 从 Internet 下载和保存文件?从 url 下载文件:

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

但是Long.MAX_VALUE出于安全原因,我更喜欢将下载限制为 2mb,而不是 ,所以我将其替换为

fos.getChannel().transferFrom(rbc, 0, 2097152);

但是现在,我想知道如何处理文件大小大于 2mb 的情况?

我该怎么做才能检查文件是否损坏?

4

2 回答 2

5

您是否考虑过按照RFC检查 Content-Length 标头?然后,您可以检查这是否超过了某个可接受的值(在您的情况下为 2MB)并拒绝进一步处理。您可以通过初始 HTTPHEAD请求完成此操作,然后GET如果您满意,则可以通过读取GET响应的标头并在可接受的情况下继续进行进一步的流式传输来完成此操作。

或者(但不可否认),您可以使用BufferedReader2MB 的缓冲区并将其与标头进行比较。

至于腐败,您最好使用其他评论中所述的校验和。当然,这需要您预先知道资源的校验和,而不是您可能从 HTTP 响应本身获得的东西。

于 2013-09-17T07:03:42.827 回答
1

这个问题实际上有两个方面:

  • 你怎么知道你是否下载了整个文件,以及

  • 你怎么知道你下载的内容是否已损坏。

首先要注意的是,如果您将文件传输“切割”为 2Mb,那么如果明显传输的文件大小为 2Mb,您可以确定它不会完整。(从外观上看,您当前的代码将在任何传输编码被解码后为您提供字节......这简化了事情。)

接下来要注意的是,HTTP 响应通常会包含一个Content-length标头,该标头告诉客户端在响应正文中期望多少字节(传输编码)内容。但是,这不会告诉您您实际收到的字节(解码后)是否真的正确。(此外,这个标题是可选的......你不能依赖它在那里。)

正如@ato 所指出的,在实际尝试读取数据之前,最好检查 GET(或 HEAD)响应中的 Content-length 。

但是,了解您是否拥有完整/未损坏文件的唯一可靠方法是根据校验和或(理想情况下)与传输分开获得的加​​密哈希进行检查。没有使用 HTTP 协议获取校验和或散列的标准方法。

于 2013-09-17T07:12:48.233 回答