我正在使用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的情况?
我该怎么做才能检查文件是否损坏?
答案 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协议获得校验和或散列的标准方法。