另一个“动作脚本-3中的本地文件访问”q-u-etion

时间:2012-04-20 09:14:04

标签: actionscript-3 flash flex directory

我希望我可以帮助解决我的动作​​问题。

(inb4:'你究竟想要完成什么(除了在没有用户许可的情况下打开任意文件)?'link

我正在努力协助学生练习 - 所以我想我会想出一个随机画廊的例子。这样的想法是学生将能够生成SWF文件,并且在同一目录中,他们将有一个带有图像的文件夹。然后SWF电影将读取目录的内容;选择随机图像,然后显示它。

我希望这可以在本地(当学生开发时)完成 - 并且,如果他们选择这样做,他们应该能够在线上传整个目录 - 并且希望这个例子能够以任何方式工作。事实并非那么容易 - 所以这些是我的问题

  • 他们说,为了获得本地目录列表,我应该使用AIR - 这是什么意思?是否有一些可执行文件 - 其他而不是flashplayerdebugger - 如果它使用AIR,我应该调用它来重现SWF?
    • 是否可以在不使用此AIR的情况下获取本地目录列表(与下面的Flex代码类似?)
  • 好像我可以加载本地文本文件;但我无法加载本地位图文件。是否可以加载位图文件?
  • 如果您无权访问互联网,那么如何为文件/文件夹授予本地访问权限,因此您无法访问settings_manager04.html - 但您希望使用Flash应用程序本地文件和本地网络上的网络套接字?

现在,有一件事是大多数学生使用Flash CSx版本 - 另一方面我在Linux上,所以我试图制作一个Flex示例;所以我提供了示例作为Flex代码,但我也想知道Flash CS环境的可能答案。目录结构,编译行和代码在本文末尾给出 - 但这里是“application”目录的样子:

rgaltest_dir.png


好的,所以这里有更详细的问题。首先,我想我会尝试阅读目录内容 - 所以我在这里尝试了代码:AS3 Basics: List all files in a folder including subdirectories (AIR ...学生的Flash CS - 但这似乎很难失败。

所以我想 - 好吧,然后让我们把一个文本文件放在与.swf相同的目录中,它将包含一个图像列表; e.g。

cat > fileslist.txt <<EOF
img/01.jpg
img/02.jpg
EOF

然后,Flash应用程序将首先读取此文件 - 然后继续从内容中选择随机图像。但是在第一瞬间,我得到了:

An ActionScript error has occurred:
SecurityError: Error #2148: SWF file file:///home/rgaltest/rgaltest.swf cannot access local resource file:///home/rgaltest/fileslist.txt. Only local-with-filesystem and trusted local SWF files may access local resources.
  at flash.net::URLStream/load()
  at flash.net::URLLoader/load()
  at rgaltest()[/home/rgaltest/rgaltest.as:23]

所以,答案似乎是:

现在,我喜欢拥有-use-network=false - 因为学生可能需要在该示例中集成其他基于网络的内容。然后,如果您在浏览器中打开SWF,然后右键单击,然后选择“全局”,则会显示类似于“settings_manager04.html”(“全局安全设置面板”)页面的内容设置“ - 但它是否适用于SWF文件在Flash CS中显示为Ctrl-Enter构建的一部分(或者相应地,那些用flashplayerdebugger打开的那些?)所以我尝试一下 - 选择”编辑位置“, “浏览文件夹”,在“始终允许”下选择/home/rgaltest

flash_settings

...现在fileslist.txt加载好了;当.swf与flashplayerdebugger一起运行时。

是的,现在加载了文件列表,我将继续加载位图..所以我添加了相应的代码(onImgLoaded等),这就是我在日志中得到的:

At frame #1
file onTextLoaded: img/01.jpg,img/02.jpg,
At frame #2
file onImgLoaded: [object URLLoader]
TypeError: Error #1034: Type Coercion failed: cannot convert "ÿØÿà
...
¿ÿÙ" to flash.display.Bitmap.
  at rgaltest/onImgLoaded()[/home/rgaltest/rgaltest.as:64]
  at flash.events::EventDispatcher/dispatchEventFunction()
  at flash.events::EventDispatcher/dispatchEvent()
  at flash.net::URLLoader/onComplete()
At frame #3
At frame #4
...

有趣的是 - 图像已经被读取 - 因为它的所有二进制内容都被转储到日志中!然而,它不能被解释为位图数据???!


首先,这是我的目录布局:

mkdir /home/rgaltest
cd /home/rgaltest
touch rgaltest.as
touch fileslist.txt
mkdir img
cd img
convert -size 320x240 gradient:\#4b4-\#bfb 01.jpg
convert -size 320x240 gradient:\#b44-\#bff 02.jpg
chmod -R 777 /home/rgaltest   # to ensure no problem with file permissions

rgaltest.as如下;我用以下代码编译:

/path/to/flex_sdk_4.6.0.23201_mpl/bin/mxmlc -static-link-runtime-shared-libraries -use-network=true -verbose-stacktraces -debug=true rgaltest.as

...我在本地检查(确保mm.cfg已正确设置,另请参阅Solution – Error #2010: Local-with-filesystem SWF files are not permitted to use sockets. » Mark Lapasa ):

# in one terminal:
tail -f ~/.macromedia/Flash_Player/Logs/flashlog.txt

# in another terminal:
/path/to/flashplayer_11/flashplayerdebugger rgaltest.swf

最后,这里是rgaltest.as

package {
  import flash.display.Sprite;
  import flash.text.TextField;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.IEventDispatcher;
    import flash.net.*; //URLLoader;
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    [SWF(width="550", height="400")]
    public class rgaltest extends MovieClip {

    public var _pictureArray:Array;
    public var frameCnt:Number = 0;

    public var myTextLoader:URLLoader;
    public var isFileslistLoaded:Boolean = false;

    public var myImgLoader:URLLoader;
    public var isImgLoading:Boolean = false;


        // constructor - create/initialize objects here
        public function rgaltest() {
      this.stage.frameRate = 10; // frames per second

      // load the text file with image list
      myTextLoader = new URLLoader();
      myTextLoader.addEventListener(Event.COMPLETE, onTextLoaded);
      myTextLoader.load(new URLRequest("fileslist.txt"));

            // add event listener for onEnterFrame
            configureListeners(this);
    }

    private function configureListeners(dispatcher:IEventDispatcher):void {
      dispatcher.addEventListener(Event.ENTER_FRAME, my_OnEnterFrame);
        }

    public function onTextLoaded(e:Event):void {
      _pictureArray = e.target.data.split(/\n/);
      trace("file onTextLoaded: " + _pictureArray);
      isFileslistLoaded = true;
    }

        public function my_OnEnterFrame(event:Event):void {
      frameCnt++;
      trace("At frame #" + frameCnt);
      if (isFileslistLoaded) {
        if (!isImgLoading) {
          //load a random image
          var rndChoice:Number = Math.floor(Math.random()*2) + 1;
          myImgLoader = new URLLoader();
          myImgLoader.addEventListener(Event.COMPLETE, onImgLoaded);
          myImgLoader.load(new URLRequest(_pictureArray[rndChoice]));
          isImgLoading = true;
        }
      }
    } // end onEnterFrame

    public function onImgLoaded(e:Event):void {
      trace("file onImgLoaded: " + e.target);
      var _image:Bitmap = Bitmap(e.target.data);
      var _bitmap:BitmapData = _image.bitmapData;
      addChild(_image);
    }

  } //end class
} //end package

其他一些相关链接:

1 个答案:

答案 0 :(得分:1)

Bump - 似乎我解决了位图加载问题(将它放在单独的帖子中,这样我就不会过多地阻塞OP);我刚使用Loader类而不是URLLoader;请参阅下面的代码(还注意OP中随机计算中的错误,在下面进行了更正)。

无论如何 - 这就是事情:当我在学生的Flash CSx上尝试Loader课程时,它往往会悲惨地失败!但是,也许那是因为在这些情况下,我们没有从“settings_manager04.html”授予该文件夹的任何权限?当在Flash中生成与此类似的代码时,应该注意哪些特殊事项?

以下是重做的rgaltest.as

package {
  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.events.IEventDispatcher;
  import flash.net.*; //URLLoader;
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.Loader; //*

  [SWF(width="550", height="400")]
  public class rgaltest extends MovieClip {

    public var _pictureArray:Array;
    public var frameCnt:Number = 0;

    public var myTextLoader:URLLoader;
    public var isFileslistLoaded:Boolean = false;

    public var myImgLoader:Loader;
    public var isImgLoading:Boolean = false;


    // constructor - create/initialize objects here
    public function rgaltest() {
      this.stage.frameRate = 10; // frames per second

      // load the text file with image list
      myTextLoader = new URLLoader();
      myTextLoader.addEventListener(Event.COMPLETE, onTextLoaded);
      myTextLoader.load(new URLRequest("fileslist.txt"));

      // add event listener for onEnterFrame
      configureListeners(this);
    }

    private function configureListeners(dispatcher:IEventDispatcher):void {
      dispatcher.addEventListener(Event.ENTER_FRAME, my_OnEnterFrame);
    }

    public function onTextLoaded(e:Event):void {
      _pictureArray = e.target.data.split(/\n/);
      trace("file onTextLoaded: " + _pictureArray);
      isFileslistLoaded = true;
    }

    public function my_OnEnterFrame(event:Event):void {
      frameCnt++;
      trace("At frame #" + frameCnt);
      if (isFileslistLoaded) {
        if (!isImgLoading) {
          //load a random image
          var rndChoice:Number = Math.floor(Math.random()*2) + 0;
          trace("Loading: " + rndChoice + " / " + _pictureArray[rndChoice]);
          myImgLoader = new Loader();
          myImgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded);
          myImgLoader.load(new URLRequest(_pictureArray[rndChoice]));

          isImgLoading = true;
        }
      }
    } // end onEnterFrame

    public function onImgLoaded(e:Event):void {
      trace("file onImgLoaded: " + e.target);
      var _image:Bitmap = Bitmap(myImgLoader.content);
      var _bitmap:BitmapData = _image.bitmapData;
      addChild(_image);
    }

  } //end class
} //end package