关于Flash Player 10的上传文件机制研究

2009年06月20日 | 作者:Fonny

 

这些天在做我的网络相册,播放方面很容易,本来打算用Flash结合纯代码组件做,但是自己的Flash这边功力不是很够,用代码绘图和Flash设计也不是很熟悉,费了不少周折,最后还是用Flex框架搞定.

很简单,用List做的缩略图Bar,用SWFLoader加载大图.

SWFLoader相当方便,甚至连加载进度的百分比都用属性准备好了.

 

既然是相册,必然需要上传图片.

Flash Player 10(下文称做:FP)的FileReferenceList (下文称做:FRList)和FileReference(下文称做:FR)FileReferenceListFileReferenceList类增加了load()和save()方法,同时用只读的data属

性(DataArray类型)保存本地和待上传的文件实际内容.

如果要显示本地文件,或者预览待上传的文件,可以用Loader类的loadByteArray()方法读取FR的data内容.

值得注意的几个要点:

1,FR一次只能上传或下载一个文件,

FRList可以用Browse()方法让用户选择多个文件,并保存在fileList属性(Array类型)中,fileList的数据都是FR.也就是说,可以一次选择多个文件,然后遍历这个fileList,一个一个顺序上传或下载,然后就应该清空FR的内容,因为它只能做一次.

2,关于Browse()方法,

只能通过用户操作类的事件才能打开windows对话框,而使用代码方式调用这个方法会报错.

3,Browse()方法可以多次调用,但是必须是在FR上传或下载动作之前.

多次调用的结果是只保存最后一次Browse()选择的文件,而不是累加.

4,必须用FP 10.0以上的编译版本.

FR的load(),save()方法和data属性从FP10开始支持,之前的版本无法使用这些方法和属性.

5,必须借用第三方语言实现服务器保存的服务.

本人使用且仅能使用PHP脚本,可以实现单个文件的上传,更改文件名为Flex端指定名称,建立并将文件保存到指定目录(多层),将实际保存文件的目录和文件名保存到指定数据库,并返回任意信息通知Flex端工厂化处理.

6,及时移除前台的complete事件的监听.

如果使用MVC框架,注意单例类保存FR的引用时的Event事件触发问题.本人使用Cairngorm框架,如果不及时移除监听,会造成前台预览本地文件的load()方法的complete事件在upload()方法的complete事件时再次触发前台的处理函数.

7,如果要接收服务器脚本返回的数据,应该监听upload_complete_data事件,并读取event的data属性.

FR的upload_complete_data事件只能返回PHP的echo打印的数据,而不是return.

在PHP脚本中,return只能用来终止脚本,类似于AS3中的return无参功能.

8,如果要用FR的upload传递本地数据到服务器脚本,只能通过URLRequest的data属性,而这个data属性只接受String类型和URLVariable类型(动态类)的数据,同时,URLVariable类的自定义属性只能接受”名称:值”类型的数据,比如:

 

var URLVars : URLVariable = new URLVariable();

var URLReq:URLRequest = new URLRequest();

URLVars.myName = “Fonny”;

URLRequest.data = URLVars;

…

 

9,URLRequest需要设置的属性:

首先,应该设置URLRequest.method属性,该属性接受URLRequestMethod类定义的常量POST和GET.关于POST和GET的区别请查阅HTML相关资料.

然后,将URLRequest的url属性指定为uploader脚本相对于Application的相对位置的String,如:

如果PHP脚本在Application的本目录,可以直接指定为:”uploader.php”;

如果在子目录PHPscript中,则为:”PHPscript/uploader.php”或”./PHPscript/uploader.php”;

uploader请求,类似于HTTPService,具体区别或者说他们根本就是一个东西,我还没有证实,但是根据Adobe官方文档,并没有说他们是同一种服务,而是分开讲解的,所以我暂且认为他们有所不同.

10,(09-06-21)今天证实,FR的load()和upLoad()方法都会触发complete事件,而且互相独立,即使是upload之前调用过load把本地文件加载到内存中,之后调用upload()的时候还是会重新触发一次complete事件.所以还是那句话,及时移除FR各个阶段的监听,特别是多图上传的时候.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值