[原]as3 flash web 应用 (1) 批量上传之Adobe官方FileReferenceList例子解析

2010年06月06日 星期日 17:24

搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。


(鉴于最近有些抓取机器和抄袭者,把标题的【原】字都复制,我不得不声明:本文为 yukon12345原创,转载请注明出处 http://blog.csdn.net/yukon12345)


最近想山寨一下百度的各项功能,比如图片上传,音乐播放器,相册,动感相册,文章编辑器。一个一个来。哈哈。

swfupload虽然方便,但还是自己从头到尾写个吧。研究了下adobe官方flash批量上传(FileReferenceList)的例子。


下面的as3放到ide里看吧。

使用方法:新建一个fla,里面用工具随便画个图形,转化为元件,选择成按钮,设实例名设置为bb,另外注意上传路径。错误会有ioerror提示

然后文档属性-》文档类里填入FileReferenceListExample ,调试即可

 

package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.FileReference;
import flash.net.FileReferenceList;

public class FileReferenceListExample extends Sprite {

public static var LIST_COMPLETE:String = "listComplete";//定义一个静态变量,用以标示所有文件传完后的事件
public function FileReferenceListExample() {//构造函数

bb.addEventListener(MouseEvent.MOUSE_DOWN,onBuClick)//在fla中随便新建一个按钮,属性面板中实例名设置为bb

}
private function onBuClick(e:Event){
initiateFileUpload();
}
private function initiateFileUpload():void {
var fileRef:CustomFileReferenceList = new CustomFileReferenceList();//实例化下面的包外类
fileRef.addEventListener(FileReferenceListExample.LIST_COMPLETE, listCompleteHandler);
fileRef.browse(fileRef.getTypes());//打开上传对话框,fileRef.getTypes()为获取允许类型数组
}

private function listCompleteHandler(event:Event):void {
trace("listCompleteHandler");
}
}
}
//包外类
import flash.events.*;
import flash.net.FileReference;
import flash.net.FileReferenceList;
import flash.net.FileFilter;
import flash.net.URLRequest;

class CustomFileReferenceList extends FileReferenceList {//包外类CustomFileReferenceList
private var uploadURL:URLRequest;
private var pendingFiles:Array;//待加文件数组

public function CustomFileReferenceList() {//构造函数
uploadURL = new URLRequest();
uploadURL.url = "http://127.0.0.1/upload/up.php";//发送数据到处理地址
initializeListListeners();
}

private function initializeListListeners():void {
addEventListener(Event.SELECT, selectHandler);//上传对话框按下确定按钮后
addEventListener(Event.CANCEL, cancelHandler);//上传对话框取消按钮后
}

public function getTypes():Array {//返回允许类型数组
var allTypes:Array = new Array();
allTypes.push(getImageTypeFilter());
allTypes.push(getTextTypeFilter());
return allTypes;
}

private function getImageTypeFilter():FileFilter {//FileFilter类。(1.说明文字,2允许后缀)
return new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png");
}

private function getTextTypeFilter():FileFilter {//FileFilter类。(1.说明文字,2允许后缀)
return new FileFilter("Text Files (*.txt, *.rtf)", "*.txt;*.rtf");
}

private function doOnComplete():void {
//当上传全部发完时发送的事件“FileReferenceListExample.LIST_COMPLETE”(type=listComplete)
var event:Event = new Event(FileReferenceListExample.LIST_COMPLETE);
dispatchEvent(event);
}

private function addPendingFile(file:FileReference):void {//将一个文件引用推入待发文件数组
trace("addPendingFile: name=" + file.name);
pendingFiles.push(file);
file.addEventListener(Event.OPEN, openHandler);//侦听打开本地文件读取事件
file.addEventListener(Event.COMPLETE, completeHandler);//侦听本地文件发送到服务器完成
file.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);//侦听io错误
file.addEventListener(ProgressEvent.PROGRESS, progressHandler);//侦听发送过程
file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);//侦听安全错误
//file.addEventListener(DataEvent.)
file.upload(uploadURL);//重要语句。上传至指定网址。upload属FileReference的公共方法
}

private function removePendingFile(file:FileReference):void {//删除缓存文件。释放内存
for (var i:uint; i < pendingFiles.length; i++) {

if (pendingFiles[i].name == file.name) {//根据上传完毕的文件名删除该项
pendingFiles.splice(i, 1); //pendingFiles数组删除一项
if (pendingFiles.length == 0) {
doOnComplete(); 
}
return;
}
}
}

private function selectHandler(event:Event):void {//上传框确认按钮按下
trace("selectHandler: " + fileList.length + " files");
//fileList为FileReferenceList类的一个公共属性。由于此类继承自它,所以可以直接使用
pendingFiles = new Array();
var file:FileReference;
for (var i:uint = 0; i < fileList.length; i++) {
file = FileReference(fileList[i]); //根据FRL的公共filelist数组,生成FR对象,推入pendingFile数组
addPendingFile(file);
}
}

private function cancelHandler(event:Event):void {//取消按钮
// var file:FileReference = FileReference(event.target);
trace("cancelHandler:canceled");
}

private function openHandler(event:Event):void { //当打开文件时,输出文件名
var file:FileReference = FileReference(event.target);
trace("openHandler: name=" + file.name);
}

private function progressHandler(event:ProgressEvent):void {//传输时输出
var file:FileReference = FileReference(event.target);
trace("progressHandler: name=" + file.name + " bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}

private function completeHandler(event:Event):void {//单个文件时完成时
var file:FileReference = FileReference(event.target);
trace("completeHandler: name=" + file.name);
removePendingFile(file);
}

private function httpErrorHandler(event:Event):void {
var file:FileReference = FileReference(event.target);
trace("httpErrorHandler: name=" + file.name);
}

private function ioErrorHandler(event:Event):void {//io错误时
var file:FileReference = FileReference(event.target);
trace("ioErrorHandler: name=" + file.name);
}

private function securityErrorHandler(event:Event):void {//安全沙箱错误时
var file:FileReference = FileReference(event.target);
trace("securityErrorHandler: name=" + file.name + " event=" + event.toString());
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值