Java 如何知道从url下载的文件是否不完整?
我正在使用来自的这个伟大片段从url下载一个文件:Java 如何知道从url下载的文件是否不完整?,java,download,corrupt,Java,Download,Corrupt,我正在使用来自的这个伟大片段从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().transfer
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的情况
如何检查文件是否损坏?您是否考虑过根据检查内容长度标题?然后,您可以检查这是否超过某个可接受的值(在您的案例中为2MB),并拒绝进一步的处理。您可以通过一个初始HTTP
HEAD
请求,然后是一个GET
(如果您高兴的话),或者通过读取GET
响应的头并继续进行进一步的流式处理(如果可以的话)来完成这一任务
或者(但必须承认是丑陋的),您可以使用BufferedReader
传入2MB的缓冲区,并将其与头进行比较
至于腐败,最好使用其他评论中所述的校验和。当然,这需要您预先知道资源的校验和,而不是从HTTP响应本身获得的信息。这个问题实际上有两个方面:
- 如何知道您是否下载了整个文件,以及
- 如何知道下载的内容是否已损坏
内容长度
头,该头告诉客户端响应体中预期的(传输编码的)内容字节数。但是,这并不能告诉您实际收到的字节(解码后)是否正确。(此外,此标题是可选的……您不能依赖它的存在。)
正如@ato所指出的,在实际读取数据之前,最好先检查GET(或HEAD)响应中的内容长度
但是,要知道您是否拥有完整/未损坏的文件,唯一可靠的方法是根据从传输中单独获得的校验和或(理想情况下)加密散列对其进行检查。没有使用HTTP协议获取校验和或哈希的标准方法 校验和是检查文件完整性的最好方法之一。但这假设我有下载文件的原始校验和,或者我必须在下载之前完全下载,对吗?是的,你需要原始校验和来验证。