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

Posted

技术标签:

【中文标题】在客户端将大文件(> 2GB)压缩成 ZIP【英文标题】:Compressing huge files (> 2GB) into ZIP on the client side 【发布时间】:2012-10-27 14:06:59 【问题描述】:

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

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

【问题讨论】:

为什么是 ZIP?您可以使用其他算法吗?你能做一个Flash上​​传器吗? ZIP 因为它是最广泛接受的。我宁愿不使用 Flash。 【参考方案1】:

您可以使用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 了解更多示例。

【讨论】:

【参考方案2】:

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

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

编辑:

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

【讨论】:

该工具中有添加的功能,我没有评论。这就是我没有选择 FTP 的原因,这对于这种操作来说是显而易见的选择。有 Flash“压缩器”吗? 那么在知道它不会变得更小的情况下压缩它有什么意义呢?如果您只需要让它看起来就像它正在做某事,那么可以,使用您找到的库之一。 我真的认为你应该更好地了解压缩是如何工作的,然后再做进一步的事情。根据 DVD 映像中的数据类型,“DVD 映像”可以压缩到几个字节。因此,请在继续之前了解您的要求。 我不想偏离主题并讨论压缩用例。我会记住你的回答,但如果有人有其他可能有用的东西,我会等待。 我已经删除了它们,因为它们与我的问题无关,我想让它们保持干净。如果您也这样做,我将不胜感激。

以上是关于在客户端将大文件(> 2GB)压缩成 ZIP的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将大 zip 部分解压到一个文件夹中

如何将大文件(12gb)拆分为多个 1GB 压缩(.gz)档案? C#

linux下分卷压缩,从Linux下载大于4G文件到本地,并且在本地合并

将大文件 (2GB) 上传到 Autodesk Forge Data Management API

格式工厂将大视频文件压缩成一个比较的适合手机播放的文件

javazip压缩包过大解压失败