11

node.js我正在使用and构建一个上传工具socket.io,因为它们通常会上传非常大的文件,而普通的上传表单不起作用。问题是他们想在发送之前将文件压缩成 zip,以提高传输效率。

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

4

2 回答 2

8

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

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

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

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

编辑:您还可以实现自己的Writer 构造函数,以便在 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 编写器实现以获取更多示例。

于 2012-11-15T20:29:11.213 回答
4

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

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

编辑:

哦,顺便说一句,ZIP 对于随机数据确实效率低下,因此您将浪费 CPU 时间进行压缩/解压缩,并且几乎不会缩小任何大小。

于 2012-11-07T13:57:11.943 回答