Flex上载文件的处理方法

Flex下载文件的处理方法
Flex下载文件的处理方法 



项目中常常需要对用户提供下载的需求,在java web工程中,通常可以通过servlet来方便的实现,但是在flex中前台实现下载还是有些麻烦。Flex提供了FileReference类,FileReference类里提供了download和upload方法,一看就知道是用来下载跟上传的,我们来仔细看download方法的参数,(request:URLRequest, defaultFileName:String = null),第一个是RULRequest,即文件的地址,第二个是文件名,但是很多情况下,我们数据是在前台组装的,在服务器上并没有保存,或没有固定地址,所以该方法有时并不能达到我们下载的目的。

首先,我们其实可以将flex前台下载转为java后台下载,举个例子,如果flex前台有数据需要保存在用户本地,可以打开一个新的servlet链接,将要保存的数据通过get或post方式提交给servlet,然后转给servlet处理,这样就轻松解决了下载的问题。

其次,flex从flash10开始还是支持下载前台数据的。 flash10开始,FileReference增加了一个save方法,参数为(data:Object, defaultFileName:String = null),在调用save方法时,只需将文件内容传给data,浏览器会自动打开一个保存对话框,让用户选择保存目录。有两个要注意的地方,1、save方法flash10及以上才有,客户端flash版本需跟上,且代码编译环境也要在10以上,eclipse环境下,选中项目,右键properties,flex compiler选项,将required flash player version 设为10.0.0或以上,否则将找不到save方法。2、save方法只能通过用户交互来调用。怎么理解用户交互,例如,点击一个下载按钮这算是用户交互,而一般的回调方法则不是用户交互。如下载一张图片,如果图片还没加载进来,我们经常是先要进行加载,然后监听事件,然后在回调函数里进行处理,如果将save方法写在回调函数里面,将会报错:Error #2176: 某些动作(如显示弹出窗口的动作)只能通过用户交互来调用。所以很多时候我们必须采用双按钮,一个用来加载数据,一个用来下载数据。

接下来说下如何实现批量下载。因为安全原因,web程序是不可能让网页在用户不知情的情况下将数据保存在本地的,所以如果照上面的方法,如果下载10个文件要弹10个保存框,这样用户肯定接受不了的。能不能只弹一个?暂时我没有找到方法,不过现在有个折中的办法,将用户要下载的文件打包成一个压缩包,这样用户只需点击一次,但多了一个解压的操作。目前为止,这是最好的方法。

如何在flex前台对文件进行压缩?现在已有了成熟的类库FZip http://codeazur.com.br/lab/fzip/ 。FZip is an Actionscript 3 class library to load, modify and create standard ZIP archives.有了FZip可以很方便的读取,修改,创建zip压缩文件。例如下面代码就能实现文件压缩下载:
var zip:FZip = new FZip();
zip.addFile(fileName,fileByteArray);
var zipData:ByteArray = new ByteArray();
zip.serialize(zipData);
file.save(zipData,”test.zip”);

因为flex跟java后台是异步交互,在实际使用过程中,可能会碰到很多问题,耐心调试一下一定可以实现文件任意下载方式。