问题 将巨大的文件(> 2GB)压缩到客户端的ZIP中


我正在构建一个上传工具 node.js 和 socket.io,因为他们通常上传难以置信的巨大文件,普通的上传表格无法正常工作。问题是他们希望在发送之前将文件压缩成zip,以提高传输效率。

我一直在研究压缩方法,比如 JSZip 要么 zip.js,但这些都不适用于非常大的文件。我能做什么?


7600
2017-11-07 13:45


起源

为何选择ZIP?你能用另一个algorighm吗?你能做一个Flash上​​传器吗? - Andrey Akhmetov
ZIP因为它被广泛接受。我宁愿不使用Flash。 - Enrique Moreno Tent


答案:


您可以使用压缩最多4GB的数据 zip.js 但:

  • 它只适用于Chrome
  • 它会很慢(我的旧笔记本电脑上每GB压缩数据大约30分钟)

你可以在线试试 这个演示。您必须在“选择临时存储”输入中选择“HDD”选项。然后你可以从文件系统导入大文件并监视内存消耗:它应该是稳定的(我的笔记本电脑上大约300MB)。

选择“HDD”意味着zip.js将使用 文件API:目录和系统 存储压缩数据。此API目前仅适用于Chrome,并允许将数据写入沙盒虚拟文件系统。该演示使用不需要用户权限的临时存储。

编辑:您也可以实现自己的 作家构造函数 zip.js压缩它时,将数据流传输到服务器的功能:它不依赖于文件系统API,应该适用于您支持的每个浏览器。 Writer必须实现这两种方法:

init(callback[, onerror])
// initializes the stream where to write the zipped data

writeUint8Array(array, callback[, onerror])
// writes asynchronously a Uint8Array into the stream.

// getData method is optional

这是 一个例子 自定义Writer和Reader构造函数。你也可以看看 zip.js作家实现 更多例子。


8
2017-11-15 20:29



谢谢,但我也需要它在Firefox中。无论如何,好的答案。 - Enrique Moreno Tent
然后你应该编写自己的Writer构造函数。 - check_ca


如果您正在寻找客户端的压缩器,我很遗憾地告诉您,JS不是可行的方法。

另一方面,最好的办法是告诉用户在上传之前压缩文件。或者甚至使用其他一些工具(FTP也许?)。

编辑:

哦,顺便说一句,ZIP对于随机数据来说效率非常低,所以你会浪费CPU时间进行压缩/解压缩,你几乎不会缩小任何大小。


4
2017-11-07 13:57



该工具中增加了一些功能,我没有评论。这就是为什么我没有选择FTP,这将是这种操作的明显选择。有Flash“压缩机”吗? - Enrique Moreno Tent
那么压缩一些东西知道它不会变得更小的重点是什么?如果你只需要制作它 看 喜欢它正在做某事,然后是的,使用你找到的一个库。 - alexandernst
我真的认为在进一步做之前你应该更好地理解压缩是如何工作的。 “DVD图像”可以压缩到几个字节,具体取决于该DVD图像内部的数据类型。所以,请在继续之前了解您的要求。 - alexandernst
我不想引导偏离主题并讨论压缩用例。我会记住你的答案,但如果有人有其他可能有用的东西,我会等。 - Enrique Moreno Tent
我删除了它们,因为它们与我的问题不相符,我想保持它们的线程干净。如果你也这样做,我会很感激。 - Enrique Moreno Tent