關於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各個階段的監聽,特別是多圖上傳的時候.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章