ActionScript上传下载


499 第 23 章 文件管理 File Management 23.0 简介 Introduction 第 8 版以前,Flash Player 不支持任何机制让用户浏览其电脑上的文件。此外,Flash Player 也没有上传或下载文件的机制。因此,多数网站应用程序都使用 HTML 的办法上传和下 载文件。没有部署在网站上的 Flash 应用程序,通常得使用特殊办法上传和下载文件。现 在,Flash Player 8 以及更新版本则支持新的 API,大幅简化文件 I/O,让 Flash Player 可 以浏览用户系统,找出要上传和下载的文件。 Flash Player 可让用户使用 FileReference 和 FileReferenceList 类,以浏览其本地 磁盘上的文件以及上传和下载文件。本章讨论这些 API 的使用细节。 23.1 下载文件 Downloading Files 问题 你想让用户下载文件至他们的电脑。 解法 使用 FileReference 对象的 download() 方法。 │ 第 23 章:文件管理 500 讨论 flash.net.FileReference 类定义 download() 方法,让用户从 URL 下载文件至他们 的电脑。当 Flash Player 调用 download() 方法时,就会试着打开标题为“Select location for download”的对话框。此 对话框可让用户使用标准操作系统对话框,以浏览其本地磁盘, 找出他们想保存文件的位置。 调用 download() 方法的第一步,是构造 FileReference 对象,如下所示: var fileReference:FileReference = new FileReference(); download() 方法至少需要一个 URLRequest 对象作为参数,指明你想从哪里的 URL 下 载文件。最简单的情况下,URL 是指向用户可以下载的静态文件。下列范例打开一个保 存对话框,让用户选择他们想把 example.txt(位在 SWF 所在服务器的相同目录)的 一份拷贝保存到何处: var urlRequest:URLRequest = new URLRequest("example.txt"); fileReference.download(urlRequest); 构造 URLRequest 对象时,指定文件的完整路径,就像指定 URL 那样简单,如下列范 例所示: var urlRequest:URLRequest = new URLRequest("http://www.myexamplesite.com/example. txt"); fileReference.download(urlRequest); 保存对话框也可让用户改变他们所下载的文件名称。默认情况下,文件名框会显示文件名 称(因其存在于服务器上)。前例中,保存对话框的文件名框会显示 example.txt。不过, 许多情况下,你会想使用不同的默认名称,而非 URL 所指定的文件名称。例如,如果静 态 文件是由服务端 脚本所 建 , 可 能 会 以 唯一的 标识符作为文件名 ( 例 如 , R7AS82892KHWI014.jpg),但是,你不想以此作为默认方式而显示给用户看。此外,有 些情况下,当文件是由脚本在请求时动态创建的,URLRequest 对象会指向该脚本。在这 类情况下,保存对话框的文件名框的默认值是该脚本的名称(例如,script.cgi),这样 不但对用户不友好,而且如果后缀名不正确,Windows 电脑也会误解该文件。 download() 方法接收第二个可选参数,你可以此替保存对话框的文件名框指定不同的默 认值。第二个参数是字符串,其值会显示在文件名框内。下列范例提示用户下载一个由脚 本(script.cgi)在请求时动态创建的文件。此例中,脚本输出一个 JPEG 图片文件。 此时,不是使用默认的文件名值(script.cgi),而是将文件名值指定为 example.jpg: 23.1 下载文件 │ 501 var urlRequest:URLRequest = new URLRequest("script.cgi"); fileReference.download(urlRequest, "example.jpg"); 使用 download()方法时,使用 try...catch 语句是很重要的,因为该方法可能抛出错误。 如果错误没有适当处理,可能造成程序无法正常运作(如果程序以为操作成功),并显示 默认错误消息给用户。让 Flash Player 抛出未处理的事件,而显示默认错误消息给用户, 几乎肯定不是好主意,因为那可能会让用户觉得好像有什么东西坏掉了。比起不处理错误 而言,以 ActionScript 程序处理错误,可让应用程序以更优雅的方式响应错误。两种最常 见的错误是 IllegalOperationError 和 SecurityError。当你调用 download(),而 保存对话框已经是打开状态时,就会发生 IllegalOperationError(一次只能开启一个 保存对话框)。当 SWF 没有权限下载文件时(SWF 是不受信赖的文件),就会发生 SecurityError: try { fileReference.download(urlRequest, fileName); } catch (illegalOperation:IllegalOperationError) { // 处理非法运算错误的代码 } catch (security:SecurityError) { // 处理安全错误的代码 } 虽然比较不常见,download() 方法也可以抛出类型为 ArgumentError 和 MemoryError 的错误。当 URLRequest 参数的 data 属性的类型不为 URLVariables 或 String 时, 就会发生 ArgumentError 错误。虽然你的 URLRequest 可让你指定字节数组给 data 属性,但是,只有当 data 属性为类型 URLVariables 或 String 时,download() 方 法才能运作。内存错误很罕见,只有当两种情况之一存在时,才会发生。如果 URLRequest 设成 GET 请求,而且 System.useCodePage 为 true,则 Flash Player 也许无法按需要 把 Unicode 字符转成多字节字符格式。此外,Flash Player 也许无法分配必要的内存以打 开保存对话框。 download() 方法除了可以抛出错误外,也可以分派错误事件。当 Flash Player 因安全原 因而无法下载文件时,download() 方法就会抛出类型为 SecurityErrorEvent 的安全 错误事件。当 Flash Player 的沙箱安全机制不同意 SWF 有权限从指定的 URL 下载文件 时,就会发生安全错误事件。当下载文件时,因下列原因之一而发生错误时,download() 方法就会分派类型为 IOErrorEvent 的 I/O 错误事件:  网络错误。 │ 第 23 章:文件管理 502  服务器要求验证,而 Flash Player 并非在浏览器内运行。  无效的协议(只有 HTTP、HTTPS 和 FTP 能用)。 你必须添加事件监听器以处理错误事件,例如 SecurityErrorEvent 和 IOErrorEvent。 替错误事件添加事件监听器的方式,就像替标准事件所做的那样。下列范例替 IOErrorEvent 类型的事件添加监听器。 fileReference.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 交叉参考 锦囊妙计 23.2。 23.2 侦测用户何时选择要下载的文件 Detecting When a User Selects a File to Download 问题 你想侦测用户何时选择文件以开始下载。 解法 监听 select 事件。监听 cancel 事件,侦测用户何时点击“取消”按钮。 讨论 download() 方法不会暂停 ActionScript 代码的执行。只要 download() 方法一被调 用,Flash Player 就会试着打开保存对话框。一旦成功打开保存对话框或抛出错误,Flash Player 就会继续执行下一行 ActionScript 代码。也就是说你不能期望用户在 download() 方法调用之后,立刻选择文件,并且点击“Save”按钮。事实上,你必须监听 select 事件, 以 便 知 道 用 户 何 时 按 下 “Save”按钮。select 事件的类型为 Event ,你可 以 使 用 Event.SELECT 常数以添加监听器,如下所示: 23.3 监视下载进度 │ 503 fileReference.addEventListener(Event.SELECT, onSelectFile); 一旦 select 事件发生后,你可以读取 FileReference 对象的 name 属性,取出用户选 择的文件: private function onSelectFile(event:Event):void { trace(event.target.name); } 用户也可以选择点击保存对话框的“取消”按钮。如果用户点击“取消”按钮,则文件不会下 载,对话框则会关闭。当用户点击“取消”按钮时,FileReference 对象会分派类型为 Event 的取消事件。你可以使用 Event.CANCEL 常数以添加监听器,如下所示: fileReference.addEventListener(Event.CANCEL, onCancelDialog); 交叉参考 锦囊妙计 23.1。 23.3 监视下载进度 Monitoring Download Progress 问题 你想监视下载进度。 解法 监听 progress 事件。 讨论 你可以使用 progress 事件,在文件下载时,监视其进度。每次文件的一部分下载至用 户电脑时,FileReference 对象都会分派类型为 ProgressEvent 的 progress 事件。 你可以使用 ProgressEvent.PROGRESS 常数添加监听器,例如: fileReference.addEventListener(ProgressEvent.PROGRESS, onFileProgress); progress 事件对象有两个属性:bytesLoaded 和 bytesTotal。这两个属性分别返回已 下载的字节数以及总字节数。下列范例方法使用这些属性值,在 fileProgressField 文 │ 第 23 章:文件管理 504 本域内显示下载进度: private function onFileProgress(event:ProgressEvent):void { fileProgressField.text = event.bytesLoaded + " of " + event.bytesTotal + " bytes"; } 当文件完成下载时,FileReference 对象会分派一个类型为 Event 的 complete 事件。 使用 Event.COMPLETE 常数添加监听器: fileReference.addEventListener(Event.COMPLETE, onFileComplete); 交叉参考 锦囊妙计 23.1。 23.4 浏览文件 Borwsing for Files 问题 你想让用户浏览其本地磁盘,以选择要上传的文件。 解法 使用 FileReference 或 FileReferenceList 对象的 browse() 方法。 讨论 使用 FileReference 或 FileReferenceList 对象的 browse()方法,你可以打开对话框, 让用户浏览其本地磁盘以选择一个或多个文件。FileReference 和 FileReferenceList 类的 browse() 方法的差别,在于前者只让用户选择一个文件,而后者可让用户选择多 个文件(按住 Ctrl 或 Shift 键;对 Macinstosh 而言,是按住 Command 键): fileReference.browse(); 如同 download() 方法,browse() 方法也可能抛出错误,而且最好以 try/catch 处理 错误。下列两种场景都会发生非法操作(illegal operation)错误:  一次只能打开一个浏览对话框。如果对话框已打开,而你又调用 browse(),就会抛 出类型为 IllegalOperationError 的错误。 23.5 过滤显示在浏览窗口中的文件 │ 505  如果用户已将其全局 Flash Player 设定值配置成禁止文件浏览,则调用 browse() 方法将会抛出错误。 下列代码块说明如何使用 try/catch 块,处理调用 browse()时所抛出的 IllegalOpera- tionError: try { fileReference.browse(); } catch (illegalOperation:IllegalOperationError) { // 处理错误的代码 } 处理错误可确保 Flash Player 不会显示默认错误消息给用户(那只会令用户不安)。 交叉参考 锦囊妙计 23.5。 23.5 过滤显示在浏览窗口中的文件 Filtering Files That Display in the Browser Window 问题 你想过滤(filter)显示在浏览对话框中的文件类型,使得用户只看得到你想让他们上传的 类型的文件。 解法 传递一个 FileFilter (文件过滤器)对象数组给 browse() 方法。 讨论 默认情况下,browse() 方法打开对话框,以显示用户文件系统中的所有文件。然而,你 也可以过滤出所显示的文件类型。例如,你也许想只显示图片文件或文本文件。你可以传 递一个 flash.net.FileFilter 对象数组给 browse() 方法,以完成此事。 FileFilter 构造方法至少需要两个参数: │ 第 23 章:文件管理 506  第一个参数决定浏览对话框内“Files of type”下拉菜单中要显示什么。  第二个参数决定要过滤出哪些后缀名。 后缀名必须以分号分隔,每个前面都添加星号和点号。下面构造 FileFilter 对象,过 滤出后缀名为 .png、.gif 和 .jpg 的文件: var fileFilter:FileFilter = new FileFilter("Images", "*.png;*.gif;*.jpg"); 此外,你也可以指定第三个 Macintosh 文件类型参数。如同后缀名,文件类型也是以分 号分隔。当 Macintosh 文件类型参数省略时,就以后缀名作为 Windows 和 Macintosh 文 件的过滤器。当指定了 Macintosh 文件类型参数时,后缀名就作为 Windows 文件的过滤 器,而碰到 Macintosh 文件时就会被忽略,因为会优先使用 Macintosh 文件类型。 Macintosh 操作系统现在支持以后缀名作为决定文件类型的方式,但是,也依然支持指定 给文件的类型代码。 你可以指定要使用的一个(或多个)过滤器,做法是将其作为数组元素,传递给 browse() 方法,如下所示: fileReference.browse([fileFilter]); 前例中,只有一个过滤器传给 browse() 方法。每个传给 browse() 方法的过滤器,都 会在浏览对话框的“Files of type”下拉菜单中新增一个选项。例如,下列代码在“Files of type” 菜单中允许四个选项:Images、Documents、Archives 和 All。 var fileFilter1:FileFilter = new FileFilter("Images", "*.png;*.gif;*.jpg"); var fileFilter2:FileFilter = new FileFilter("Documents", "*.txt;*.doc;*.pdf;*.rtf"); var fileFilter3:FileFilter = new FileFilter("Archives", "*.zip;*.tar;*.hqx"); var fileFilter4:FileFilter = new FileFilter("All", "*.*"); _fileReference.browse([fileFilter1, fileFilter2, fileFilter3, fileFilter4]); 当你传递一个 FileFilter 对象的数组给 browse()方法时,有一种可能会使得 browse() 方法抛出类型为 ArgumentError 的参数错误。即如果任何 FileFilter 对象有不正确 的格式值,就会发生参数错误。 文件过滤器参数也适用于 FileReferenceList 的 browse()方法。 交叉参考 锦囊妙计 23.4。 23.6 侦测用户何时选择要上传的文件 │ 507 23.6 侦测用户何时选择要上传的文件 Detecting When the User Has Selected a File to Upload 问题 你想侦测用户何时从浏览对话框选择了文件。 解法 监听 select 事件。监听 cancel 事件,确定用户是否以及何时点击“取消”按钮。 讨论 当用户从浏览对话框选择文件并且点击“打开”按钮时,FileReference 对象就会分派类型 为 Event 的 select 事件。你可以使用 Event.SELECT 常数添加监听器,例如: fileReference.addEventListener(Event.SELECT, onSelectFile); 当用户选择文件时,该文件的细节会立刻可用(名称、大小、创建日期等)。例如,一旦 FileReference 对象分派 SELECT 事件,你可以取出文件名,如下例所示: selectedFileTextField.text = fileReference.name; 当用户从浏览对话框点击“取消”按钮时,FileReference 对象会分派类型为 Event 的 cancel 事件。你可以使用 Event.CANCEL 常数添加监听器,如下所示: fileReference.addEventListener(Event.CANCEL, onCancelBrowse); select 和 cancel 事件也适用于 FileReferenceList 对象。 交叉参考 锦囊妙计 23.7。 │ 第 23 章:文件管理 508 23.7 上传文件 Uploading Files 问题 你想让用户上传文件。 解法 使用 FileReference 对象的 upload() 方法。 讨论 FileReference 对象的 upload() 方法可让你使用服务端脚本(配置成接受使用 HTTP (S)的上传)上传文件至服务器。至少,upload() 方法需要一个 URLRequest 对象作 为参数,以指定你想把文件数据发送到哪个脚本的 URL: var urlRequest:URLRequest = new URLRequest("uploadScript.cgi"); fileReference.upload(urlRequest); 所有上传都使用 POST,而且 Content-Type 为 multipart/form-data。默认情况下, Content-Disposition 设置成 Filedata。脚本需要知道 Content-Disposition 的值, 才能读取文件数据。如果脚本需要使用的 Content-Disposition 并非默认值,就得指定 一个值,作为传给 upload() 方法的第二个可选参数,如下所示: fileReference.upload(urlRequest, "UploadFile"); 若用户已经使用 browse()选择文件,你只能上传该文件。如果用户使用 FileReference 对象的 browse() 方法选择一个文件,那么,在 select 事件发生之后,你可以调用 upload()。如果用户使用 FileReferenceList 选择多个文件,那么,你必须替该对象 的 fileList 属性里的每一个文件都调用 upload()。FileReferenceList 对象的 fileList 属性是个数组,内含一些 FileReference 对象(对应用户所选择的每个文件)。 upload() 方法可抛出错误。upload() 可能抛出的错误与 download() 可能抛出的相 同。此外,如同 download(),upload() 方法也可以分派安全错误事件和 I/O 错误事件。 参见锦囊妙计 23.1 有关这些错误和错误事件的处理细节。 23.8 监视文件上传进度 │ 509 交叉参考 锦囊妙计 23.1。 23.8 监视文件上传进度 Monitoring File Upload Progress 问题 你想在文件上传至服务器时监视其进度。 解法 监听 progress 事件。 讨论 你可以监视文件的上传进度,就像你可以监视文件的下载进度一样。FileReference 对 象在文件上传时会分派 progress 事件。当文件已完成上传时,就会分派 complete 事 件。参见锦囊妙计 23.3 的细节。 交叉参考 锦囊妙计 23.3。
还剩10页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

macrotea

贡献于2011-06-16

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf