在現在幫助系統沒有完善的情況下(Flash 9 沒有幫助, Flex Builder 2 的只有英文), 這裡寫篇簡單的教程, 方便大家往AS3 過渡.
在AS3 中, 有關於網路操作的內置類全部在flash.net 裡. 下面是本教程要用到的類的清單 :
URLLoader : 用於從網路或者本地讀取文件, 可以通過設置他的dataFormat 屬性改變收到的文本類型.
與AS2 的LoadVars 不同的是, 他的默認值URLLoaderDataFormat.TEXT 即純文字格式, 所以在讀取外部文本變量的時候得修改一下他的dataFormat 為URLLoaderDataFormat.VARIABLES. 不過在AS2 中沒有該屬性, 取代的是contentType 屬性.
URLRequest : 用於傳遞變量到伺服器, 以及URLLoader 要load 的目標路徑. 可以通過設置他的contentType 屬性改變發送到伺服器的變量類型, 默認是application/x-form-urlencoding, 也就是URLEncode 編碼.
URLVariables : 用於配置傳遞到伺服器變量的鍵/ 值集合, 如user1=Kakera&user2=Eigo.
URLLoaderDataFormat : 用於設置URLLoader 讀取文件的類型, 有TEXT (純文字), VARIABLES (URLEncoding 的鍵/ 值集合), BINARY (2 進制格式), URLLoader 會根據相應的類型進行解碼操作, 如解碼URLEncode
同時還有其他不常用的 :
URLRequestMethod : 決定使用哪種方式傳遞數據到伺服器, POST 或者GET.
URLReqeustHeader : 用於配置傳遞到服務端的HTTP 標頭.
值得一提的是, URLLoader 還有相當完整的事件讓我們來獲取讀取數據的狀態, 下面是有關URLLoader 事件的清單.
complete : 使用URLLoader.load() 方法後, 數據完全加載完畢時觸發, 通常如果能夠觸發這個事件的話, 說明你的程序沒有問題.
httpStatus : 使用URLLoader.load() 方法後, 獲取HTTP 狀態代碼時觸發, 通過判斷他的state 屬性我們可以獲得遠程文件的加載狀態. 成功(200), 沒有權限(403), 找不到文件( 404), 伺服器內部錯誤(500) 等等. 這個事件總是在compelete 之前被觸發.
ioError : 使用URLLoader.load() 方法時, 發生致命錯誤時觸發, 我還沒碰到過..
open : 使用URLLoader.load() 方法後, 開始從伺服器下載數據時觸發一次, 此時的URLLoader.bytesLoaded 一定是0.
progress : 使用URLLoader.load() 方法後, 在從伺服器下載數據的過程中持續觸發, 通過偵聽他的變化我們可以很方便的為URLLoader 做加載狀態的顯示.
securityError : FlashPlayer 的安全錯誤, 比如跨域加載, 從硬盤(文件系統) 發送/ 讀取伺服器上的數據.
關於註冊偵聽器的建議
flashplayer 內置類的所有事件都有相關事件類常量來表示, 推薦使用他們來註冊事件偵聽器. 而所有的內置類的事件類(Event) 全部在flash.events 包中,如使用:
window.attachEvent("onload",function (){AutoSizeDIV('CODE_7643')}) import flash.events.Event;
urlLoaderInstance.addEventListener(Event.COMPLETE, completeHandler);
來代替
urlLoaderInstance.addEventListener("complete", completeHandler);下面是URLLoader 支持的事件所對應類的清單, 他們可以在Flex Builder 2 的文檔中找到:
complete : Event.COMPLETE
httpStatus : HTTPStatusEvent.HTTP_STATUS
ioError : IOErrorEvent.IO_ERROR
open : Event.OPEN
progress : ProgressEvent.PROGRESS
securityError : SecurityErrorEvent.SECURITY_ERROR
然後下面是使用URLLoader 的一些簡單的例子
1. 單純的讀取伺服器或者硬盤上同目錄下叫Variables.txt 文本文件, 文本的內容是:
user1=Kakera&user2=Eigo&user3=KeiragoLoadVariablesOnly.fla
import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLLoaderDataFormat; import flash.net.URLVariables; import flash.events.Event; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.events.SecurityErrorEvent; // // 配置 URLRequest, 設置目標路徑等 // var request:URLRequest = new URLRequest("Variables.txt"); / // 配置 URLLoader, 註冊偵聽器等 // var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, loader_complete); loader.addEventListener(Event.OPEN, loader_open); loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus); loader.addEventListener(ProgressEvent.PROGRESS, loader_progress); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security); loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError); loader.load(request); function loader_complete (e:Event):void { trace("Event.COMPLETE"); trace("目標文件的原始數據(純文字) : " + loader.data); // // 使用URLVariables 處理原始數據並進行遍歷同時輸出數據 // var variables:URLVariables = new URLVariables(loader.data); for (var i in variables) { trace(i + " : " + variables[i]); } } function loader_open (e:Event):void { trace("Event.OPEN"); trace("讀取了的字節: " + loader.bytesLoaded); } function loader_httpStatus (e:HTTPStatusEvent):void { trace("HTTPStatusEvent.HTTP_STATUS"); trace("HTTP 狀態代碼 : " + e.state); } function loader_progress (e:ProgressEvent):void { trace("ProgressEvent.PROGRESS"); trace("讀取了的字節: " + loader.bytesLoaded); trace("文件總字節 : " + loader.bytesTotal); } function loader_security (e:SecurityErrorEvent):void { trace("SecurityErrorEvent.SECURITY_ERROR"); } function loader_ioError (e:IOErrorEvent):void { trace("IOErrorEvent.IO_ERROR"); }
2. 提交數據到ServerSide.asp, 並輸出伺服器的返回值
ServerSide.asp <%@LANGUAGE="Jscrīpt" CODEPAGE="65001"%>
<% // // 全局 Header, 設置編碼, 以及緩存 // with (Response) { Charset = "utf-8"; Buffer = true; Expires = -10; ContentType = "text/plain"; } var buffer = "列出所有服務端接收到的變量: /n"; var i; var e = new Enumerator(Request.Form); // // 遍歷集合 // for (; !e.atEnd(); e.moveNext()) { i = e.item(); buffer += String(i) + " : " + String(Request.Form(i)) + "/n"; } Response.Write(buffer); %>
SendAndLoadVariables.fla
import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLLoaderDataFormat; import flash.net.URLVariables; import flash.events.Event; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.events.SecurityErrorEvent; // // 配置URLVariables, 設置傳遞到伺服器的數據 // var variables:URLVariables = new URLVariables(); variables.userName = "Kakera"; variables.password = "********"; // // 配置URLRequest, 設置目標路徑, 設置提交的數據, 方法(POST / GET) // var request:URLRequest = new URLRequest("http://localhost/urlloadersample/ServerSide.asp"); request.data = variables; request.method = URLRequestMethod.POST; // // 配置 URLLoader, 註冊偵聽器等 // var loader:URLLoader = new URLLoader(); // // 服務端將要返回的是純文字數據 // loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener(Event.COMPLETE, loader_complete); loader.addEventListener(Event.OPEN, loader_open); loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus); loader.addEventListener(ProgressEvent.PROGRESS, loader_progress); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security); loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError); loader.load(request); function loader_complete (e:Event):void { trace("Event.COMPLETE"); trace("目標文件的原始數據(純文字) : /n" + loader.data); } function loader_open (e:Event):void { trace("Event.OPEN"); trace("讀取了的字節: " + loader.bytesLoaded); } function loader_httpStatus (e:HTTPStatusEvent):void { trace("HTTPStatusEvent.HTTP_STATUS"); trace("HTTP 狀態代碼 : " + e.status); } function loader_progress (e:ProgressEvent):void { trace("ProgressEvent.PROGRESS"); trace("讀取了的字節: " + loader.bytesLoaded); trace("文件總字節 : " + loader.bytesTotal); } function loader_security (e:SecurityErrorEvent):void { trace("SecurityErrorEvent.SECURITY_ERROR"); } function loader_ioError (e:IOErrorEvent):void { trace("IOErrorEvent.IO_ERROR"); }
原文連結
沒有留言:
張貼留言