首页 > 设计 > WEB开发 > 正文

23.1.下载文件

2023-08-14 18:53:51
字体:
来源:转载
供稿:网友
问题
我想让用户从服务器上下载文件
解决办法
使用FileReference 对象的download( ) 方法
讨论
flash.net.FileReference 类定义了一个download( ) 方法允许用户通过URL下载文件。当Flash播放器调用download( )方法时,它试图打开一个对话框,标题为"Select location for download.",这个对话框使用标准的系统对话框让用户选择文件保存路径。

在调用download( )方法之前,先构造一个FileReference 对象,如:
+展开
-ActionScript
var fileReference:FileReference = new FileReference( );

download( ) 方法至少需要一个URLRequest 对象作为参数,指定下载文件的路径,下面的例子打开保存对话框保存下载的example.txt 文件:
+展开
-ActionScript
var urlRequest:URLRequest = new URLRequest("example.txt");
fileReference.download(urlRequest);

文件路径还可以是绝对路径:
+展开
-ActionScript
var urlRequest:URLRequest = new URLRequest("http://www.myexamplesite.com/example.txt");
fileReference.download(urlRequest);

保存对话框允许对下载的文件进行重命名,默认是与服务器文件的名称相同,如上面的例子,

保存对话框显示的名称为example.txt。但在大多数情况下,我们喜欢重命名文件,比如一个有服务端脚本产生的静态文件采用统一的命名规则进行命名(如R7AS82892KHWI014.jpg) 可能它不会显示出这个名字,因为这是由服务端脚本动态生成,如果URLRequest对象指向这个脚本那么保存对话框显示的可能就是脚本的名字(如., script.cgi),这样很不友好,也将导致文件无法被系统识别,因为文件扩展名并不正确。

download( ) 方法的第二个参数就是指定显示在保存对话框的文件名,下面的例子演示用户下载一个动态生成的图片文件,默认的文件名为(script.cgi),这里指定保存的文件名为example.jpg:
+展开
-ActionScript
var urlRequest:URLRequest = new URLRequest("script.cgi");
fileReference.download(urlRequest, "example.jpg");

download( ) 方法最好放在try...catch 语句中执行,因为该方法可能会抛出异常,主要两种异常:
IllegalOperationError和SecurityError。当保存对话框已经打开的情况下调用download( )方法会抛出IllegalOperationError,SecurityError异常是由于SWF不允许下载所导致。
+展开
-ActionScript
try {
fileReference.download(urlRequest, fileName);
}
catch (illegalOperation:IllegalOperationError) {
// code to handle an illegal operation error
}
catch (security:SecurityError) {
// code to handle a security error
}

还有些不太常见的异常,如ArgumentError和MemoryError。ArgumentError是由于URLRequest 的data属性不是URLVariables。虽然URLRequest的data属性可设置为二进制数组,但是download( )方法只有在data属性为URLVariables时才有效。memory 异常比较少见,有两种可能会导致此异常:当URLRequest设置为GET请求而且System.useCodePage为true,Flash播放器将不能把Unicode转换到字节字符格式,还有可能就是Flash播放器没有足够的内存打开保存对话框。

像SecurityErrorEvent 和IOErrorEvent. 异常必须监听异常处理函数, 如下面的例子为IOErrorEvent添加处理函数:
+展开
-ActionScript
fileReference.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表