載入內容

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() 或 BitmapData.drawWithQuality() 方法,存取載入影像中的像素。 drawWithQuality 方法可以在 Flash Player 11.3 及更新版本,以及 AIR 3.3 及更新版本中取得。

  • 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() 、 BitmapData.drawWithQuality() 和 SoundMixer.computeSpectrum() 方法擷取 RTMP 串流中的執行階段圖形和聲音資料,您必須允許伺服器上的存取權限。使用伺服器端 ActionScript Client.videoSampleAccess 和 Client.audioSampleAccess 屬性,允許存取 Flash Media Server 上的特定目錄。如需詳細資訊,請參閱 伺服器端 ActionScript 語言參考 ( drawWithQuality 方法可以在 Flash Player 11.3 及更新版本,以及 AIR 3.3 及更新版本中取得)。