客户端上传前文件压缩 [英] File compression before upload on the client-side

查看:33
本文介绍了客户端上传前文件压缩的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上我将处理大型 XML 文件(大约 20 - 50 MB).这些文件需要上传到服务器上.

我知道不可能用 javascript 接触文件,也不可能在客户端实现 HTTP 压缩.

我的问题是,是否存在压缩文件并具有 javascript API 的任何解决方案(闪存/动作脚本)?

场景是这样的:

  1. 尝试上传 50 MB XML 文件
  2. 在上传之前使用 Javascript 抓取它并将其发送到压缩器.
  3. 上传压缩文件而不是原始文件.

解决方案

Flash 内置的 ByteArray 实现有一个方法 (ByteArray::deflate 来压缩内容 (bytearray) 压缩算法是DEFLATE 压缩数据格式规范 1.3 版.

还有一个 ByteArray::compress 方法,它使用 zlib 算法

稍等,我会为您编写一些示例代码以使用此类并将其公开给 JavaScript.

编辑

我已将文件上传到 http://www.filefactory.com/file/cf8a39c/n/demo5.zip

EDIT 2 对于那些无法下载文件的人:

我在 demo5.fla 中的 ActionScript 代码(编译为 demo5.swf)

import flash.external.ExternalInterface;导入 flash.net.FileReference;导入 flash.events.Event;导入 flash.utils.ByteArray;如果(外部接口.可用){//flash.system.Security.allowDomain("localhost");ExternalInterface.addCallback("deflate", doDeflate);ExternalInterface.addCallback("compress", doCompress);}var 方法:String="deflate";var b:ByteArray;函数 doCompress(_data:String):void {方法=压缩";执行(_数据);}函数 doDeflate(_data:String):void {方法=放气";执行(_数据);}函数 exec(_data:String):void {b=新字节数组();b.writeUTFBytes(_data);b.位置=0;如果(方法==压缩"){b.压缩();} else if(method=="deflate") {b.放气();}执行();}函数执行():无效{如果(外部接口.可用){b.位置=0;var str:String=b.readUTFBytes(b.bytesAvailable);ExternalInterface.call("onExec", str);}}

我嵌入 swf 的 HTML 代码:

<button onclick="doCompress()">压缩</button><div id="flashContent"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1" id="demo5" align="middle"><param name="movie" value="demo5.swf"/><param name="quality" value="high"/><param name="bgcolor" value="#ffffff"/><param name="play" value="true"/><param name="loop" value="true"/><param name="wmode" value="window"/><param name="scale" value="showall"/><param name="menu" value="true"/><param name="devicefont" value="false"/><param name="salign" value=""/><param name="allowScriptAccess" value="always"/><embed src="demo5.swf" quality="high" bgcolor="#869ca7"width="1" height="1" name="demo5" align="middle"play="true" loop="false" quality="high" allowScriptAccess="always"类型="应用程序/x-shockwave-flash"pluginspage="http://www.macromedia.com/go/getflashplayer"></嵌入></对象>

最后是 javascript 代码:

function doDeflate() {var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu";//DATA 包含要放气的数据thisMovie("demo5").deflate(data);}函数 doCompress() {var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu";//DATA 包含要放气的数据thisMovie("demo5").compress(data);}函数 onExec(数据){//DATA 包含放气后的数据警报(数据);}函数 thisMovie(movieName) {如果(navigator.appName.indexOf(微软")!= -1){返回窗口[电影名称];} 别的 {返回文件[电影名称];}}

Basically I'll be working with large XML files (approx. 20 - 50 MB). These files needs to be uploaded on a server.

I know it isn't possible to touch the files with javascript, nor to implement HTTP compression on the client-side.

My question is that if any solution exists (flash / action script) that compresses a file and has a javascript API?

The scenario is this:

  1. Trying to upload 50 MB XML file
  2. Before upload a grab it with Javascript and send it to the compressor.
  3. Upload the compressed file instead of the original one.

解决方案

Flash's inbuilt implementation of ByteArray has a method (ByteArray::deflate to deflate the contents (of the bytearray) The deflate algorithm is the DEFLATE Compressed Data Format Specification version 1.3.

There;s also a ByteArray::compress method which compresses using the zlib algorithm

Hold on a bit, I'll write you some sample code to use this class and expose it to JavaScript.

EDIT

I've uploaded the file at http://www.filefactory.com/file/cf8a39c/n/demo5.zip

EDIT 2 For those who couldn't download the files:

My ActionScript code in demo5.fla (compiled to demo5.swf)

import flash.external.ExternalInterface;
import flash.net.FileReference;
import flash.events.Event;
import flash.utils.ByteArray;

if(ExternalInterface.available) {
    //flash.system.Security.allowDomain("localhost");
    ExternalInterface.addCallback("deflate", doDeflate);
    ExternalInterface.addCallback("compress", doCompress);
}

var method:String="deflate";
var b:ByteArray;
function doCompress(_data:String):void {
    method="compress";
    exec(_data);
}

function doDeflate(_data:String):void {
    method="deflate";
    exec(_data);
}

function exec(_data:String):void {
    b=new ByteArray();
    b.writeUTFBytes(_data);
    b.position=0;
    if(method=="compress") {
        b.compress();
    } else if(method=="deflate") {
        b.deflate();
    }
    executed();
}

function executed():void {
    if(ExternalInterface.available) {
        b.position=0;
        var str:String=b.readUTFBytes(b.bytesAvailable);
        ExternalInterface.call("onExec", str);
    }
}

My HTML code to embed the swf:

<button onclick="doDeflate()">Deflate</button>
<button onclick="doCompress()">Compress</button>
<div id="flashContent">
    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1" id="demo5" align="middle">
        <param name="movie" value="demo5.swf" />
        <param name="quality" value="high" />
        <param name="bgcolor" value="#ffffff" />
        <param name="play" value="true" />
        <param name="loop" value="true" />
        <param name="wmode" value="window" />
        <param name="scale" value="showall" />
        <param name="menu" value="true" />
        <param name="devicefont" value="false" />
        <param name="salign" value="" />
        <param name="allowScriptAccess" value="always" />

        <embed src="demo5.swf" quality="high" bgcolor="#869ca7"
             width="1" height="1" name="demo5" align="middle"
             play="true" loop="false" quality="high" allowScriptAccess="always"
             type="application/x-shockwave-flash"
             pluginspage="http://www.macromedia.com/go/getflashplayer">
        </embed>
    </object>
</div>

and finally the javascript code:

function doDeflate() {
    var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu";
    //DATA CONTAINS DATA TO BE DEFLATED
    thisMovie("demo5").deflate(data);
}

function doCompress() {
    var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu";
    //DATA CONTAINS DATA TO BE DEFLATED
    thisMovie("demo5").compress(data);
}

function onExec(data) {
    //DATA CONTAINS THE DEFLATED DATA
    alert(data);
}

function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName];
    } else {
        return document[movieName];
    }
}

这篇关于客户端上传前文件压缩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆