1

我正在寻找一种强大的方法来根据给定页面上的信息动态创建 zip 存档并使其可供下载。客户端压缩是必须的,因为我的脚本是从一个小书签运行的。

当我更关心编写脚本的其余部分时,我的第一种方法是将信息发布到在我的本地服务器上运行的几行 PHP 中,然后将其压缩并发送回。这显然不适合值得分享的书签。

我今天早些时候找到了 JSZip,我以为这就是它的结束。这个库在运行时运行良好;不幸的是,我创建的档案经常超过几 MB,这会破坏 JSZip。(注意:我只在 Chrome 上测试过。)

由于数据 URI,纯 JS 下载也有时髦名称的限制,我打算使用 JSZip 推荐的方法来解决这个问题,使用使用 Flash 的 Downloadify。这让我想知道 JS zip 生成的大小限制是否可以/已经通过使用 Flash 和 JS 的类似相互作用来克服。

我用谷歌搜索了这个,但没有使用 Actionscript 的经验,我无法快速弄清楚我所问的是否可行。是否可以使用 JS 中的 Flash 对象在客户端创建相对较大(到 10 MB)的 zip 文件?

谢谢!

4

1 回答 1

2

首先是一些数字:

  • Flash 承诺,如果文件小于 100 Mb,上传将起作用(我不知道它是指 base 10 还是 base 16)。

  • Flash 中有两个流行的库可用于创建 ZIP 存档,但请先阅读。

  • ZIP 存档器是一个既可以压缩数据又可以存档数据的程序,它完全按照这个顺序执行。即,它分别压缩每个文件,然后将其附加到整个存档。这会产生更差的压缩率,但允许迭代创建存档。好处是您甚至可以在完全压缩之前开始发送存档。

  • ZIP 的替代方法是首先使用专用存档器,然后一次压缩整个存档。这样,有时可以实现好几倍的压缩,但代价是您必须一次处理数据。

  • 但是 FlashByteArray.compress()方法为您提供了 deflate 算法的本机实现,这与您在 ZIP 存档器中使用的大部分内容相同。所以,如果你已经实现了类似 tar 的东西,你可以显着减少被发送文件的大小。

  • 但是 Flash 是一个单线程环境,因此,您必须小心压缩数据的大小,并且可能必须凭经验找出它。或者只使用 ZIP - 更多冗余,但更易于实施。

我以前使用过这个库:nochump。没有任何问题。虽然它有点老了,尝试移植它以使用 Alchemy 操作码可能是有意义的(用于快速内存访问,显着降低了低级二进制算术运算的成本,例如二进制或二进制等)这个库实现了 CRC32 算法,这是 ZIP 存档的重要组成部分,它使用 Alchemy - 所以它应该快得多,但你必须自己实现其余的。

您可能会考虑的另一个选择是 Goole 的 NaCl - 在那里您可以从存档器和压缩实现中进行选择,因为它本质上运行本机代码,因此您甚至可以使用 bz2 和其他现代东西 - 不幸的是,仅在 Chrome 中(用户必须启用它)或 Firefox(需要插件)。

于 2012-04-23T08:03:02.643 回答