·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]AS3加载SWF文件/图像/声音/视频的说明

时间:2014-03-17 08:58cuplayer.com
使用 Loader 类加载 SWF 文件和图像(JPG、GIF 或 PNG 文件) 。除只能与本地文件系统内容交互的沙箱中的 SWF 文件之外

  加载 SWF 文件和图像
使用 Loader 类加载 SWF 文件和图像(JPG、GIF 或 PNG 文件) 。除只能与本地文件系统内容交互的沙箱中的 SWF 文件之外,其它所有 SWF 文件都可以从任何网络域加载SWF 文件和图像。只有本地沙箱中的 SWF 文件才能从本地文件系统中加载 SWF 文件和图像。但是,只能与远程内容交互的沙箱中的文件只能加载位于受信任的本地沙箱或只能与远程内容交互的沙箱中的本地 SWF 文件。只能与远程内容交互的沙箱中的 SWF 文件可加载非 SWF 文件 (例如图像)的本地内容,但是无法访问所加载内容中的数据。 
从不受信任的来源 (如 Loader 对象的根 SWF 文件所在域以外的域)加载 SWF 文件时,您可能需要为 Loader 对象定义遮罩,以防止加载的内容(Loader 对象的子级)绘制到该遮罩之外的 Stage 部分中,如以下代码所示:

  1. import flash.display.*; 
  2. import flash.net.URLRequest; 
  3. var rect:Shape = new Shape(); 
  4. rect.graphics.beginFill(0xFFFFFF); 
  5. rect.graphics.drawRect(0, 0, 100, 100); 
  6. addChild(rect); 
  7. var ldr:Loader = new Loader(); 
  8. ldr.mask = rect
  9. var url:String = "http://www.cuplayer.com/content.swf"
  10. var urlReq:URLRequest = new URLRequest(url); 
  11. ldr.load(urlReq); 
  12. addChild(ldr); 

  当调用 Loader 对象的 load() 方法时,可以指定一个 context 参数,该参数是一个LoaderContext 对象。 LoaderContext 类包括三个属性,用于定义如何使用加载的内容的上下文:
■ checkPolicyFile:仅当加载图像文件 (不是 SWF 文件)时才会使用此属性。如果图像文件所在的域与包含 Loader 对象的文件所在的域不同,则指定此属性。如果将此属性设置为 true, Loader 将检查跨域策略文件的原始服务器 (请参阅第 656页的“Web 站点控制 (跨域策略文件) ” ) 。如果服务器授予 Loader 域适当权限,则来自Loader 域中 SWF 文件的 ActionScript 可以访问所加载图像中的数据。换言之,可以使用 Loader.content 属性获取对表示所加载图像的 Bitmap 对象的引用,或使用BitmapData.draw() 方法访问所加载图像中的像素。 
■ securityDomain:仅当加载 SWF 文件(不是图像)时才会使用此属性。如果 SWF文件所在的域与包含 Loader 对象的文件所在的域不同,则指定此属性。对于securityDomain 属性而言,目前仅支持以下两个值:null (默认值)和SecurityDomain.currentDomain。如果指定 SecurityDomain.currentDomain,则要求加载的 SWF 文件应 “导入”到执行加载的 SWF 文件所在的沙箱中,这意味着其运行方式就像它已从执行加载的 SWF 文件自己的服务器中加载一样。只有在位于加载的SWF 文件服务器上找到跨域策略文件时才允许这样做,从而允许执行加载的 SWF 文件所在的域进行访问。如果找到所需的策略文件,则一旦加载开始,加载方和被加载方可以自由地互相访问脚本,原因是它们位于同一沙箱中。请注意,多数情况可以通过执行普通加载操作然后让加载的 SWF 文件调用 Security.allowDomain() 方法来取代沙箱导入。由于加载的 SWF 文件将位于自己的原始沙箱中,并因而能够访问自己实际服务器上的资源,因此后一种方法会更易于使用。 
■ applicationDomain:仅当加载使用 ActionScript 3.0 编写的 SWF 文件 (不是图像或使用 ActionScript 1.0 或 2.0 编写的 SWF 文件)时才会使用此属性。当加载文件时,可以指定文件应放置在特定的应用程序域中,而不是默认放置在一个新的应用程序域中,这个新的应用程序域是执行加载的 SWF 文件所在应用程序域的子域。请注意,应用程序域是安全域的子单位,因此仅当要加载的 SWF 文件由于以下原因来自您自己的安全域时,才能指定目标应用程序域:该文件来自您自己的服务器,或者使用securityDomain 属性已成功地将该文件导入到您的安全域中。如果指定应用程序域,但加载的 SWF 文件属于其它安全域,则在 applicationDomain 中指定的域将被忽略。有关详细信息,请参阅第 603页的 “使用 ApplicationDomain 类”。有关详细信息,请参阅第 362页的 “指定加载上下文” 。

Loader 对象的一个重要属性就是 contentLoaderInfo 属性,该属性是一个 LoaderInfo 对象。与大部分对象不同, LoaderInfo 对象在执行加载的 SWF 文件和被加载的内容之间共享,并且双方始终可以访问该对象。当被加载的内容为 SWF 文件时,它可以通过DisplayObject.loaderInfo 属性访问 LoaderInfo 对象。 LoaderInfo 对象包括诸如加载进度、加载方和被加载方的 URL、加载方和被加载方之间的信任关系等信息及其它信息。
有关详细信息,请参阅第 361页的 “监视加载进度” 。加载声音和视频除只能与本地文件系统内容交互的沙箱中的那些 SWF 文件之外,所有 SWF 文件都允许从网络来源加载声音和视频,使用 Sound.load()、NetConnection.connect() 和NetStream.play() 方法即可。 
只有本地 SWF 文件才能从本地文件系统加载媒体。只有只能与本地文件系统内容交互的沙箱或受信任的本地沙箱中的 SWF 文件才能访问这些加载文件中的数据。 
对加载的媒体还存在一些其它数据访问限制。有关详细信息,请参阅第 671页的 “作为数据访问加载的媒体” 。
使用文本字段中的 <img> 标签加载 SWF 文件和图像通过使用 <img> 标签,可以将 SWF 文件和位图加载到文本字段中,如以下代码所示:
<img src = 'filename.jpg' id = 'instanceName' >
通过使用 Te x tFi e ld 实例的 getImageReference() 方法,可以访问以这种方式加载的内容,如以下代码所示:
var loadedObject:DisplayObject =
myTextField.getImageReference('instanceName');
但是请注意,以这种方式加载的 SWF 文件和图像会被放入与各自来源相应的沙箱中。 当在文本字段中使用 <img> 标签加载图像文件时,通过跨域策略文件可以允许访问图像中的数据。通过将 checkPolicyFile 属性添加到 <img> 标签上,可以检查是否存在策略文件,
如以下代码所示:
<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >
当在文本字段中使用 <img> 标签加载 SWF 时,可以允许通过调用 Security.allowDomain()方法来访问该 SWF 文件的数据。
当在文本字段中使用 <img> 标签加载外部文件时(相对于使用嵌在 SWF 文件中的 Bitmap类) ,会自动创建一个 Loader 对象作为 Te x tFi e ld 对象的子对象,并且会将外部文件加载到该 Loader 对象中,就如同使用了 ActionScript 中的 Loader 对象来加载文件一样。在这种情况下,getImageReference() 方法返回自动创建的 Loader。由于此 Loader 对象与调用代码位于同一安全沙箱中,因此访问此对象不需要任何安全检查。

但是,当引用 Loader 对象的 content 属性来访问加载的媒体时,需要应用安全性规则。如果内容是图像,则需要实现跨域策略文件;如果内容是 SWF 文件,则需要让 SWF 文件中的代码调用 allowDomain() 方法。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器