載入內容

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

Flash Player 和 AIR 內容可以載入很多其他類型的內容,其中包括以下幾項:

  • SWF 檔

  • 影像

  • Sound

  • 視訊

  • HTML 檔案 (僅限 AIR)

  • JavaScript (僅限 AIR)

使用 Loader 類別來載入 SWF 檔案和影像

您可以使用 Loader 類別來載入 SWF 檔和影像 (JPG、GIF 或 PNG 檔案)。任何 SWF 檔 (在具有檔案系統的本機安全執行程序中之檔案除外) 都可以載入任何網路網域中的 SWF 檔和影像。只有位於本機安全執行程序中的 SWF 檔可以從本機檔案系統載入 SWF 檔和影像,但是位於具有網路的本機安全執行程序中之 SWF 檔則只能載入本機信任的和具有網路的本機安全執行程序中之 SWF 檔。位於具有網路的本機安全執行程序中之 SWF 檔可載入 SWF 檔以外的本機內容 (如影像),但無法存取載入內容中的資料。

當您從不受信任的來源 (例如與 Loader 物件的根 SWF 檔所屬網域不同的網域) 載入 SWF 檔時,可能會想要定義 Loader 物件的遮色片以避免載入的內容 (Loader 物件的子系) 繪製至該遮色片外面的「舞台」,如下列程式碼所示:

import flash.display.*; 
import flash.net.URLRequest; 
var rect:Shape = new Shape(); 
rect.graphics.beginFill(0xFFFFFF); 
rect.graphics.drawRect(0, 0, 100, 100); 
addChild(rect); 
var ldr:Loader = new Loader(); 
ldr.mask = rect; 
var url:String = "http://www.unknown.example.com/content.swf"; 
var urlReq:URLRequest = new URLRequest(url); 
ldr.load(urlReq); 
addChild(ldr);

當您呼叫 Loader 物件的 load() 方法時,可以指定 context 參數,它是 LoaderContext 物件。LoaderContext 類別包括三個屬性,可以讓您定義如何使用載入內容的環境:

  • checkPolicyFile:請只在載入影像檔 (而不是 SWF 檔) 時使用這個屬性。您必須為不是源自包含 Loader 物件之檔案所屬網域的影像檔指定這個方法。如果將這個屬性設定為 true,Loader 會檢查 URL 原則檔的原始伺服器 (請參閱網站控制 (原則檔))。如果伺服器授與 Loader 網域權限,Loader 網域中 SWF 檔的 ActionScript 就可以存取已載入影像中的資料;換句話說,您可以使用 Loader.content 屬性,取得代表載入影像之 Bitmap 物件的參考,或使用 BitmapData.draw() 方法,存取載入影像中的像素。

  • securityDomain:請只在載入 SWF 檔 (而不是影像) 時使用這個屬性。為不是源自包含 Loader 物件之檔案所屬網域的 SWF 檔指定這個方法。目前 securityDomain 屬性只支援兩個值:null (預設值) 和 SecurityDomain.currentDomain。若指定 SecurityDomain.currentDomain,則會要求將被載入端 SWF 檔「匯入」載入端 SWF 檔的安全執行程序中,也就是說,會以好像已從載入端 SWF 檔本身之伺服器載入的方式運作。只有被載入端 SWF 檔之伺服器具有 URL 原則檔,而且載入端 SWF 檔的網域允許存取,才能如此運作。如果找到所需的原則檔,則一旦載入作業開始之後,載入器與被載入者都可以自由地互相編寫對方的指令碼,因為它們都位於相同的安全執行程序中。請注意,安全執行程序匯入作業大部分也可以改為執行一般載入作業,然後讓被載入端 SWF 檔呼叫 Security.allowDomain() 方法。後面這種方法可能會比較容易使用,因為被載入端 SWF 檔將會處於本身的自然安全執行程序中,因此能夠存取本身實際伺服器上的資源。

  • applicationDomain:請只在載入以 ActionScript 3.0 撰寫的 SWF 檔 (而非影像或以 ActionScript 1.0 或 2.0 撰寫的 SWF 檔) 時使用此屬性。載入檔案時,您可以將檔案置入特定的應用程式網域中,而不是依預設置入載入端 SWF 檔之應用程式網域子系的新應用程式網域中。請注意,應用程式網域是安全網域的子單位,因此只有在所載入的 SWF 檔來自您本身的安全網域 (因為檔案來自您本身的伺服器,或是因為您已使用 securityDomain 屬性,順利地將它匯入您的安全網域) 中時,您才能指定目標應用程式網域。如果指定應用程式網域,但被載入端 SWF 檔屬不同安全網域的一部分,就會忽略您在 applicationDomain 中指定的網域。如需詳細資訊,請參閱使用應用程式網域

如需詳細資訊,請參閱指定載入內容

Loader 物件有一個重要屬性,就是 contentLoaderInfo 屬性,它是 LoaderInfo 物件。與一般其它物件不同的是,載入端 SWF 檔與載入的內容會共享 LoaderInfo 物件,而且兩方永遠都可以存取。當載入的內容是 SWF 檔時,就可以透過 DisplayObject.loaderInfo 屬性存取 LoaderInfo 物件。LoaderInfo 物件包含資訊,如載入進度、載入器與被載入者的 URL、載入器與被載入者之間的信任關係,以及其它資訊。如需詳細資訊,請參閱監視載入進度

載入聲音和視訊

任何內容 (具有檔案系統的本機安全執行程序中的內容除外) 都允許使用 Sound.load()NetConnection.connect()NetStream.play() 方法,從網路來源載入聲音和視訊。

只有具有檔案系統的本機安全執行程序和 AIR 應用程式安全執行程序中的內容,才能從本機檔案系統載入媒體。只有具有檔案系統的本機安全執行程序、AIR 應用程式安全執行程序或本機信任安全執行程序中的內容,才能存取這些載入檔案中的資料。

從載入的媒體中存取資料還有其它限制。如需詳細資訊,請參閱將載入的媒體當做資料加以存取

使用文字欄位中的 <img> 標籤載入 SWF 檔和影像

您可以使用 <img> 標籤,將 SWF 檔和點陣圖載入文字欄位中,如下列程式碼所示:

<img src = 'filename.jpg' id = 'instanceName' >

您可以使用 TextField 實體的 getImageReference() 方法,存取以這種方式載入的內容,如下列程式碼所示:

var loadedObject:DisplayObject = myTextField.getImageReference('instanceName');

但是,請注意,以這種方式載入的 SWF 檔和影像是放在對應於其來源的安全執行程序中。

當您使用文字欄位中的 <img> 標籤載入影像檔案時,可以由 URL 原則檔授與權限存取影像中的資料。您可以透過將 checkPolicyFile 特質加入至 <img> 標籤來檢查原則檔,如下列程式碼所示:

<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >

當您使用文字欄位中的 <img> 標籤載入 SWF 時,可以透過呼叫 Security.allowDomain() 方法,授與存取該 SWF 檔資料的權限。

當您使用文字欄位中的 <img> 標籤載入外部檔案 (而不是使用內嵌於 SWF 中的 Bitmap 類別) 時,會自動建立 Loader 物件做為 TextField 物件的子系,而外部檔案即載入該 Loader 中,與使用 ActionScript 中的 Loader 物件載入檔案完全一樣。在此情形下,getImageReference() 會傳回自動建立的 Loader。存取此 Loader 物件並不需要安全性檢查,因為它是位於與呼叫端程式碼相同的安全執行程序中。

但是,當您參考 Loader 物件的 content 屬性,以存取載入的媒體時,就會套用安全性規則。如果載入的內容是影像,您就必須實作 URL 原則檔;而如果載入的內容是 SWF 檔,則必須讓該 SWF 檔中的程式碼呼叫 allowDomain() 方法。

Adobe AIR

在應用程式安全執行程序中,文字欄位中的 <img> 標記會被略過,防止釣魚攻擊。 此外,在應用程式安全執行程序中執行的程式碼,不允許呼叫 Security 的 allowDomain() 方法。

使用 RTMP 伺服器所傳遞的內容

Flash Media Server 會使用「即時媒體通訊協定」(Real-Time Media Protocol,RTMP) 提供資料、音效和視訊。您可以使用 NetConnection 類別的 connect() 方法載入這個媒體,並傳遞 RTMP URL 做為參數。Flash Media Server 可以根據要求檔案的網域限制連線,並防止內容遭到下載。如需詳細資訊,請參閱 Flash Media Server 線上說明文件,網址為 www.adobe.com/go/learn_fms_docs_tw

若要使用 BitmapData.draw()SoundMixer.computeSpectrum() 方法取出 RTMP 串流中的執行階段圖形和聲音資料,則必須允許伺服器上的存取權限。使用伺服器端 ActionScript Client.videoSampleAccessClient.audioSampleAccess 屬性,允許存取 Flash Media Server 上的特定目錄。如需詳細資訊,請參閱伺服器端 ActionScript 語言參考