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

时间:2012-11-07 13:45:44

标签: javascript html5 node.js upload compression

我正在使用node.jssocket.io构建上传工具,因为它们通常会上传非常大的文件,而普通的上传表单也无法正常工作。问题是他们希望在发送之前将文件压缩成zip,以提高传输效率。

我一直在研究像JSZipzip.js这样的压缩方法,但这些方法都不适用于非常大的文件。我该怎么办?

2 个答案:

答案 0 :(得分:8)

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

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

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

选择“HDD”意味着zip.js将使用File API: Directories and System来存储压缩数据。此API目前仅在Chrome上提供,并允许将数据写入沙盒虚拟文件系统。该演示使用临时存储,不需要用户许可。

编辑:您还可以实现自己的Writer constructor功能,以便在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构造函数的an example。您还可以查看zip.js Writers implementations以获取更多示例。

答案 1 :(得分:4)

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

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

编辑:

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

相关问题