首页 > 技术文章 > Flash 文件加载方案以及一些问题及解决(1)

zhuhongjongy 2015-12-04 15:41 原文

写1是为了给以后遇到其他问题的时候留下写的空间。

在最近做的测试中需要用到flash文件加载,可是flash的安全策略使得flash文件加载异常困难。

如果用户希望不通过AIR平台去加载,那么建议通过loader方法去加载。使用方式如下:

var loadpic_i:Loader = new Loader();
loadpic_i.load(new URLRequest("1.jpg"));//预加载
            loadpic_i.contentLoaderInfo.addEventListener(Event.COMPLETE,DisplayPic);
            loadpic_i.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,imageLoading);
public function DisplayPic(e:Event)
        {
            if(this.contains(loadpic_i))
            {
                this.removeChild(loadpic_i);
            }
            this.addChild(loadpic_i);
            this.width = 550 - 20;
            this.height = 400 - 40;
            
            this.x = 10;
            this.y = 20;
            //loadpic_i.close();
            }

忽略文件中的书写不规范。

其次可以通过File方法来加载,但是这会带来一些好处,也会带来一些坏处:

使用File就必然会使用到AIR,然而AIR的跨平台特性并不太好。真的。

var myfiletype:FileFilter = new FileFilter("图片文件","*.jpg");
var file:File ;

file = new File(File.applicationDirectory.resolvePath("1.jpg").nativePath);
file.load();
file.addEventListener(Event.COMPLETE,oncomplete_prefab);


function oncomplete_prefab(e:Event)
 {
    loadpic_i.loadBytes(e.target.data);
    loadpic_i.contentLoaderInfo.addEventListener(Event.COMPLETE,DisplayPic);
            
}

这是用File的方式 加载,使用AIR就必然碰触到安全沙箱,如果书写不规范机会使软件运行出现错误:

D:\******\Adobe Flash\1.jpg
SecurityError: fileWriteResource
    at flash.filesystem::File/copyTo()
    at loadpic/oncomplete()[D:\******\Adobe Flash\loadpic.as:87]

这里出现的错误原因是在File运行时必然碰触到安全沙箱,flash文档解释如下:

此对象的 url 属性使用 app URL 架构(而不是 file URL 架构)。这意味着指定的 url 以"app:"开头(而不是以 "file:" 开头)。
此外,如果创建一个相对于 File.applicationDirectory 目录的 File 对象(通过使用 resolvePath() 方法),则该 File 对象
的 url 也使用 app URL 架构。 注意:您无法对其路径使用 app URL 架构的文件或目录进行写入。也无法删除或创建其路径使用 app URL 架构的文件或文件夹。出于安
全方面的原因,修改应用程序目录中的内容不是好的做法。如果想要存储特定于应用程序的数据,请考虑使用应用程序存储目录
(File.applicationStorageDirectory)。如果希望应用程序存储目录中的内容能够访问具有应用程序特权的功能 (AIR API),则可以
使用沙箱桥公开该功能。

解决方案是按照标准格式定义File路径:

var newfile:File = new File(File.applicationDirectory.resolvePath("1.jpg").nativePath);

 

推荐阅读