天天看點

[原]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());
}
}