我正在寻找一种强大的方法,可以根据给定页面上的信息动态创建zip存档,并使其可供下载。客户端压缩是必须的,因为我的脚本是从书签运行的。
当我更关心编写脚本的其余部分时,我的第一个方法就是将信息发布到在我的本地服务器上运行的几行PHP,然后将其压缩并发回。这显然不适合值得分享的书签。
我今天早些时候找到了JSZip,我认为这就是它的结束。这个图书馆工作时效果很好;不幸的是,我创建的档案经常超过几MB,这打破了JSZip。 (注意:我只在Chrome上对此进行了测试。)
由于数据URI,纯粹的JS下载也存在时髦名称的限制,我打算使用JSZip的推荐方法,使用使用Flash的Downloadify来解决。这让我想知道是否可以通过使用类似的Flash& amp;的相互作用来克服JS zip生成的大小限制。 JS。
我用谷歌搜索了这个,但是没有使用Actionscript的经验我无法快速弄清楚我能问的是否可能。是否可以使用JS中的Flash对象在客户端创建相对较大的(进入10s的MB)zip文件?
谢谢!
答案 0 :(得分:2)
首先是一些数字:
Flash承诺,如果文件小于100 Mb,上传将起作用(我不知道它是指基数10还是基数16)。
Flash中有两个流行的库用于创建ZIP存档,但请先阅读。
ZIP存档程序是一个压缩和存档数据的程序,它按照这个顺序执行。即它分别压缩每个文件,然后将其附加到整个存档。这会产生更差的压缩率,但允许迭代创建存档。好处是您甚至可以在完全压缩之前开始发送存档。
ZIP的替代方法是首先使用专用存档,然后立即压缩整个存档。这有时可以实现几倍更好的压缩,但成本是您必须立即处理数据。
但Flash ByteArray.compress()
方法为您提供了deflate算法的本机实现,这与您在ZIP存档中使用的内容大致相同。因此,如果您实现了类似tar的功能,则可以显着减小发送文件的大小。
但Flash是一个单线程环境,所以,你必须要小心你压缩的数据的大小,并且可能必须凭经验找到它。或者只使用ZIP - 更多冗余,但更容易实现。
我之前使用过此库:nochump。没有任何问题。虽然,它有些陈旧,尝试将其移植到使用Alchemy操作码(用于快速内存访问,显着降低二进制或二进制等低级二进制算术运算的成本)可能是有意义的。 This library实现了CRC32算法,这是ZIP存档的一个重要部分,它使用Alchemy - 所以它应该快得多,但你必须自己实现其余部分。
你可能考虑的另一个选择是Goole的NaCl - 你可以从归档和压缩实现中选择,因为它基本上运行本机代码,所以你甚至可以使用bz2和其他现代东西 - 不幸的是,只在Chrome中(并且用户必须启用它)或Firefox(需要插件)。