AS3 中使用 URLLoader 與 URLRequest 取代了先前版本 LoadVars 方法. 初學者可能又會迷糊了.
在現在幫助系統沒有完善的情況下 (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");
}