如何知道url下载的文件是否不完整?

时间:2013-09-17 06:58:21

标签: java download corrupt

我正在使用How to download and save a file from Internet using Java?中的这个精彩片段从网址下载文件:

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);

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

或者(但不可否认),您可以使用BufferedReader传递2MB的缓冲区并将其与标题进行比较。

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

答案 1 :(得分:1)

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

  • 您如何知道是否已下载整个文件,

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

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

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

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

但是,了解您是否拥有完整/未损坏文件的唯一确定方法是检查校验和或(理想情况下)您从传输中单独获取的加密哈希值。没有使用HTTP协议获得校验和或散列的标准方法。