无需完全下载即可读取Zip文件

5

是否可以在不完全下载ZIP文件的情况下读取其内容?

我正在构建一个爬虫,我不想为了索引它们的内容而下载每个zip文件。

谢谢;


应该可以仅获取文件的头部和目录表。参考:http://en.wikipedia.org/wiki/ZIP_%28file_format%29#File_headers - Pekka
“读取内容”是什么意思?你是指仅压缩文件的文件名列表吗? - Mark Byers
是的,我只需要文件名。对我来说,内容本身并不重要。 - hb.
5个回答

7
寻找中央目录的起始位置是棘手的,因为它位于文件末尾。由于每个条目都具有相同的固定大小,您可以从文件末尾开始进行一种二分搜索。二分搜索试图猜测中央目录中有多少条目。从某个合理值N开始,并检索文件的end-(N*sizeof(DirectoryEntry))部分。如果该文件位置不以中央目录条目签名开头,则N太大-减半并重复,否则,N太小,加倍并重复。与二分搜索类似,该过程维护当前的上限和下限。当两者相等时,你就找到了N的值,也就是条目数。
你访问Web服务器的次数最多为16次,因为条目数不超过64K。
这是否比下载整个文件更有效取决于文件大小。在下载之前,您可以请求资源的大小,如果它小于给定的阈值,则下载整个资源。对于大型资源,如果阈值设置得高,则请求多个偏移量将更快且对Web服务器的负担更小。
HTTP/1.1允许下载资源的范围。对于HTTP/1.0,您别无选择,只能下载整个文件。

1
@Earlz - HTTP/1.1资源范围是下载器和可中断/暂停下载的基础。请参见http://www.ietf.org/rfc/rfc2068.txt中的14.36范围。 - mdma

4

格式表明文件中包含的信息关键部分位于其末尾。然后,条目被指定为相对于该特定条目的偏移量,因此您需要访问整个文件。

GZip格式可以作为流读取。


是的,zip头在结尾处。您需要整个文件或允许您获取特定部分的下载器。 - H H
1
GZip 可以被视为一个流来读取,但实际上它只是一个压缩的流。gzip 没有任何类型的容器或多个文件,这就是为什么使用 .tar.gz.tar 组合文件并将它们压缩成 .gz 的原因。 - Samuel Neff
这更像是页脚。 - gtrak

2

这是可能的。您需要的只是允许按范围读取字节、获取结束记录(以了解 CD 的大小)、获取中央目录(以了解文件的起始位置和结束位置),然后获取适当的字节并处理它们的服务器。

以下是 Python 实现:onlinezip

[完全披露:我是该库的作者]

enter image description here


0

在ArchView中实现了一种解决方案:“ArchView可以在线打开存档文件,而无需下载整个存档。” https://addons.mozilla.org/en-US/firefox/addon/5028/

在archview-0.7.1.xpi文件中的“archview.js”文件中,您可以查看他们的JavaScript方法。


-1

我不知道这是否有帮助,因为我不是程序员。但在Outlook中,您可以预览zip文件并查看实际内容,而不仅仅是文件目录(如果它们是可预览的文档,如pdf)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接