把三个文件打个包当邮件附件,是件再平常不过的事,可它偏偏是在线网站最不知分寸的场合之一:它们收到的是您打算发出去的全部东西,常常是政务文件或者家人的照片。而浏览器本来就什么都做得了,一点也不用发出去。
从 Chrome 103、Firefox 113 和 Safari 16.4 起,它会用所谓的裸 deflate 压缩和解压。但它既不会算 zip 压缩包要求每一项都有的那个校验码,也不会写这个容器本身。这两块是在这件工具里手工写出来的,从我们那个已经有这两块的图标生成器里搬过来:一个我们在这里已经写过的格式,不必再发明一遍。
而且这件工具会回读自己。做好您的压缩包之后,它会用自己的读取器重新打开它,把每一项解压出来,并重新计算它的校验码。一个没有软件打得开的压缩包是一个假结果,而要是没有这次回读,发现它的就会是您,而且是在收件人面前。
怎么用
- 要打包,就一次放多个文件进来:工具会把它们列出来,一个一个压缩,然后还给您一个压缩包。
- 要解开,就只放一个压缩包进来:工具会显示它里面有什么,连同每一项的真实大小,由您来选要取出哪些。
- 方向是自己推断出来的,依据不是扩展名,而是文件开头那几个字节:扩展名可以改名,签名不行。
支持的格式
做压缩包时,任何文件都行;解压时,只放一个 zip 压缩包。模式是从放进来的文件的头四个字节推断的,不看它的名字。
任何文件,用来打包
一次想放多少就放多少。每一个都单独压缩,而且只有真省得下地方时才压:一个本来就压过的 JPEG 或者 PDF,压出来的流会更大,那一项于是就原样存放。
一个 zip 压缩包,用来打开
原样存放的项和用 deflate 压过的项都读得了,这几乎覆盖了现实中的全部压缩包。加密的项会被点名并搁在一边,而 Zip64 格式的压缩包会被明确拒绝。这个门槛来自这个格式的参考文档:超过 65535 项,或者大小超过四个吉字节。
它的限制
每个文件 200 MB
浏览器的压缩是在内存里做的,整个压缩包必须跟原来那些文件同时待在里面。再往上,内存不够的手机会让标签页崩溃,而不是给出结果:所以这个上限是明说的,工具会干脆拒绝。
带密码的压缩包在这里打不开,我们也不做这种压缩包
两个各自独立的理由。打开这一头:zip 格式那套老加密公认很弱,而现代的压缩包加密是一个私有扩展,还有好几个并存的变体;我们宁可把加密的项点名搁在一边,也不去解开其中一半。写这一头:要保护一个文件,安全专区那件“给文件加密”做得更好,它把整套方法都显示出来,还用六十万轮来生成密钥,而这是任何 zip 都做不到的。
Zip64 压缩包会被拒绝,而且会说明
超过 65535 项或者四个吉字节,这个格式就把它的计数放进一条额外的记录里,而通常那几个字段会顶到最大值。我们不读那条记录:与其给出一个读了一半的压缩包,工具宁可说自己读不了它。何况这么大的压缩包本来也超过了体积上限。
下载没法重建文件夹
浏览器往下送的是文件,不是目录树。所以放在子文件夹里的一项出来时,它的路径会被压平写进文件名里,工具会说明这一点。这同时也化解了“路径往上跳出解压目录”那个坑:我们会把往上跳的那些段去掉并标出来,而不是指望浏览器来保护我们。
取出多项要向浏览器要一次许可
同一个动作里下载到第二个文件时,Chrome 会来要“下载多个文件”的许可:它的源代码把上限定在同时五十个下载,并且把您的回答记到换地址为止。Firefox 则试着做过同样的一道护栏,却从来没有交付,它自己的缺陷跟踪系统里写着。至于 Safari,我们没有找到任何第一手资料。这一点绕不过去,我们也不打算绕:每次发送之间隔 350 毫秒,而您随时可以一次只取一项。
我们写出来的压缩包不带任何日期
zip 通常会记录每一项的时间。那会是这个文件唯一携带的、关于您的信息,而收件人和这个格式都不需要它。所以我们写这个格式允许的最早那个日期,1980 年 1 月 1 日:用同样的文件做两个压缩包,它们字节对字节完全一样。这跟图片专区那个图标压缩包是同一个决定。
关于这个工具的问题
我的文件会被发到什么地方吗?
不会。按 F12 打开开发者工具,切到“网络”标签页,清空列表,然后把文件放进来做一个压缩包:什么都不会出去。把网断掉再做一遍,工具照常工作。这在一件打包工具上是最要紧的一点,因为人们放进来的一般正是自己准备发出去的全部东西。
为什么我的压缩包跟原文件差不多重?
因为您的文件多半本来就压过了。一张 JPEG 照片、一个 PDF、一段视频、一个现代的办公文档:它们内部都已经带着压缩,再没有什么可省的了。工具会逐行告诉您,并把这些文件原样存放,而不是让它们变大,而再压一遍恰恰会让它们变大。压得好的是文字、老式表格、代码文件,以及无损图片。
页面上说的那次回读到底做了什么?
写好压缩包之后,工具会用自己的读取器把它重新打开,跟另一款软件会做的一样:找到目录,遍历各项,把每一项解压出来,再从得到的字节重新算出它的校验码。一个压缩包可以结构无可挑剔、校验码却是错的:那样它能通过所有形式上的检查,却在您收件人那边失败。这跟本站别处的要求是同一条:回读产出的文件,不听工具的一面之词。
为什么取出来的文件没有它们的文件夹?
因为浏览器往下送的是文件,不是目录树:它没有任何办法在您的设备上建一个文件夹,而这是件好事。所以放在子文件夹里的一项出来时,路径被压平写进了它的名字里,这样既留住了信息,也不去凭空造一个结构。这同时也让压缩包的一个老坑失了效:一项路径往上跳出解压目录的项,什么也写不到别处去,而我们照样把它的名字清理一遍。
我取出多个文件时,浏览器为什么要我授权?
因为一个网站一次点击就触发多个下载,是浏览器有理由提防的行为。“下载多个文件”这个许可只问一次,而在这里同意它没有风险,因为文件来自您自己的压缩包。我们把每次发送隔开三百五十毫秒,免得它们互相取消,而您随时可以一次只取一项。
你们能加上密码保护吗?
我们不打算加,而且有一个根本上的理由。zip 压缩包那套老加密早就公认很弱;现代的加密是这个格式的一个私有扩展,有好几个变体,各家软件之间还有差异。我们会干一大堆活儿,做出一种自己没法老实地说它结实的保护。安全专区那件加密工具解决的是真正的问题:它把整套方法都显示出来,用六十万轮来生成密钥,而且得到的文件在同一个页面上就能解开。
我能往一个已有的压缩包里再加一个文件吗?
不能直接加:这件工具要么打开一个压缩包,要么做一个新的,它不去修改它。做法是把您要的东西取出来,然后连同新加的那个文件一起重新放进来。这多一个动作,但它避开了一整类不愉快的意外:一个就地改过的压缩包可能留着它先前内容的痕迹,而一件许诺“更新”压缩包却不把它整个重写的工具,并不像它看上去那么干净。