基本上,我将处理大型XML文件(大约20 - 50 MB)。这些文件需要上传到服务器上。
我知道用javascript处理文件是不可能的,也不可能在客户端实现HTTP压缩。
我的问题是,是否存在任何解决方案(flash /动作脚本),压缩一个文件,并有一个javascript API?
场景是这样的:
1.正在尝试上载50 MB XML文件
1.在上传之前,用Javascript抓取它并将其发送到压缩器。
1.上载压缩文件,而不是原始文件。
基本上,我将处理大型XML文件(大约20 - 50 MB)。这些文件需要上传到服务器上。
我知道用javascript处理文件是不可能的,也不可能在客户端实现HTTP压缩。
我的问题是,是否存在任何解决方案(flash /动作脚本),压缩一个文件,并有一个javascript API?
场景是这样的:
1.正在尝试上载50 MB XML文件
1.在上传之前,用Javascript抓取它并将其发送到压缩器。
1.上载压缩文件,而不是原始文件。
6条答案
按热度按时间gdrx4gfi1#
你可以使用JSZip。对于输入,它支持String/ArrayBuffer/Uint8Array/Buffer,但 * 不 *
blob
s,这是你从一个<input type="file"/>
中用javascript得到的:File对象是Blob的一种特定类型,可以在Blob可以
(link)
因此,您必须首先将blob/文件转换为ArrayBuffer,例如使用
FileReader.readAsArrayBuffer()
。注意,此函数异步工作,需要使用回调函数。也有FileReaderSync可用,但“此接口仅在worker中可用,因为它启用了可能会阻塞的同步I/O”,因此我看不出使用它有什么好处。(EDIT。我不确定,但我相信您现在可以跳过blob-〉ArrayBuffer转换,直接压缩File对象。)
如果php的指令
max_file_uploads
被您的web空间主机设置为一个较小的数字,那么整个方法就特别有用,因为现在您唯一需要担心的是upload_max_filesize
以下代码示例摘录(使用
JQuery
)用于在提交前将一个multiple
文件输入的多个文件放入zip中,以供参考:在服务器端,您将访问
$_FILES["fileZip"]
。brqmpdu12#
Flash的ByteArray内置实现有一个方法(
ByteArray::deflate
,用于缩小(字节数组的)内容。缩小算法是DEFLATE Compressed Data Format Specification version 1.3。还有一个
ByteArray::compress
方法,它使用zlib算法进行压缩稍等一下,我将为您编写一些示例代码,以使用此类并将其公开给JavaScript。
编辑
我已经在http://www.filefactory.com/file/cf8a39c/n/demo5.zip上传了文件
编辑2对于无法下载文件的用户:
我在demo5.fla中的ActionScript代码(编译为demo5.swf)
我的HTML代码嵌入swf:
最后是JavaScript代码:
xuo3flqw3#
如果由于某种原因,您无法找到一个在JavaScript中适用于所有主流浏览器的解决方案,我知道这里有一个AS 3压缩库:http://code.google.com/p/ascompress/。
还有一个不太酷的选择,如果你的目标用户有点技术,为什么不让他们上传一个xml的.zip文件呢?然后在服务器端,你可以根据需要解压缩和处理。
无论哪种方式,在服务器端,你会想解压缩/解压,这应该很容易谷歌的解决方案,如果你还没有一个在脑海中。
gywdnpxw4#
使用Silverlight,您可以在客户端压缩文件,这种方法适用于所有主流浏览器。此外,您还可以通过JavaScript与Silverlight部件进行交互。此外,如果用户需要上传多个文件,Silverlight部件可以显示一个单个对话框,用于选择所有文件。唯一的缺点是您的客户端必须安装Silverlight插件。
slhcrj9b5#
考虑查看另一个stackoverflow post。阅读这两个答案可以很好地描绘压缩现实。
我正在考虑实现一个Silverlight的Flex解决方案,压缩客户端,如果用户不想安装它,压缩和解压缩文件服务器端。将更新此职位时,找到一个解决方案。
安装该控件可以节省用户的时间,这通常是正确的。对于服务器来说,它可以节省带宽和压缩处理。
b91juud36#
有一些javascript库的霍夫曼压缩免费可用,例如https://github.com/wilkerlucio/huffman_js,但我认为你的任务是不可能的,因为与javascript和html它是不可能加载大量的数据到浏览器或客户端的内存。