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各个阶段的监听,特别是多图上传的时候.