在客户端压缩大文件(> 2GB)到ZIP

我build立一个上传工具,使用node.jssocket.io ,因为他们通常上传难以置信的巨大的文件和正常的上传forms将无法正常工作。 问题是,他们想在发送文件之前压缩文件,以提高传输效率。

我一直在研究像JSZip或zip.js这样的压缩方法,但是对于非常大的文件,这两种方法都不能很好地工作。 我能做什么?

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

  • 它只会与Chrome一起工作
  • 它会很慢(我的旧笔记本电脑每GB大约30分钟的压缩数据)

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

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

编辑:你也可以实现你自己的Writer构造函数,在zip.js压缩的时候将数据stream式传输到你的服务器上:它不依赖于文件系统API,并且可以在你支持的每个浏览器上工作。 作家必须执行这两种方法:

 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作者实现的更多示例。

如果你在客户端寻找压缩机,我很遗憾地告诉你,JS不是要走的路。

从这个angular度来看,最好的办法就是告诉用户在上传文件之前先压缩文件。 甚至使用其他types的工具(FTP也许?)。

编辑:

哦,顺便说一句,随机数据的ZIP效率非常低,所以你会浪费CPU时间进行压缩/解压,而且几乎不会缩小尺寸。