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

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

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

【问题讨论】:

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

标签: javascript html node.js upload compression


【解决方案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 映像”可以压缩到几个字节。因此,请在继续之前了解您的要求。
    • 我不想偏离主题并讨论压缩用例。我会记住你的回答,但如果有人有其他可能有用的东西,我会等待。
    • 我已经删除了它们,因为它们与我的问题无关,我想让它们保持干净。如果您也这样做,我将不胜感激。
    猜你喜欢
    • 2011-04-27
    • 2015-01-19
    • 2017-03-28
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多