如何使用AIR将图像写入应用程序目录?

时间:2011-08-08 18:19:48

标签: flash actionscript-3 stream air bytearray

我正在尝试通过打开文件流并从位图数据中写入字节来将图像保存到应用程序目录。我添加了一些事件监听器来测试文件流过程但我没有收到任何响应事件。你能看看我的代码并告诉我问题可能在哪里。

        var bd:BitmapData = new BitmapData(CANVAS_WIDTH, CANVAS_HEIGHT);
        bd.draw(currentDrawing);
        var jpgEncoder:JPGEncoder = new JPGEncoder(100);
        var ba:ByteArray = jpgEncoder.encode(bd);

        var newImage:File = File.applicationDirectory.resolvePath("images/test.jpg");  
        var fileStream:FileStream = new FileStream();  
        fileStream.open(newImage, FileMode.UPDATE);  
        fileStream.writeBytes(ba); 
        fileStream.addEventListener(Event.CLOSE, fileClosed);  
        fileStream.addEventListener(Event.COMPLETE, fileComplete);  
        fileStream.addEventListener(IOErrorEvent.IO_ERROR, fileError); 
        fileStream.close();


        function fileClosed(event:Event):void {  
            outputText.text = "close";
        }

        function fileComplete(event:Event):void {  
            outputText.text = "complete";
        } 
        function fileError(event:IOErrorEvent):void {  
            outputText.text = "error"; 
        }   

4 个答案:

答案 0 :(得分:2)

AIR安全禁止写入app目录 如果你绝对需要将一些文件写入app目录,你可以使用本机帮助器来执行此操作(例如,Windows上的cmd.exe)。但是请考虑使用File.applicationStorageDirectory - 它是可写的,但隐藏在用户配置文件中的某处。

答案 1 :(得分:1)

flash.fileSystem.File.applicationDirectory是只读的。这是您与AIR应用程序捆绑在一起的资产。

对于特定于您的应用程序的读写访问,请改用flash.fileSystem.File.applicationStorageDirectory。您还可以通过File的静态属性访问其他特定于操作系统的读写目录。

此SO线程列出了适用于Windows,Mac和Linux的applicationStorageDirectory的特定位置:The Difference Of Location Storage File in air

答案 2 :(得分:0)

因为您使用的是常规open()方法,所以您将以同步模式打开文件,这意味着代码中的下一行(或语句)将不会执行,直到上一行完成。这意味着直到writeBytes()完成后才会添加事件侦听器。

尝试简单地重新排序您的代码行,如下所示:

var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.CLOSE, fileClosed);  
fileStream.addEventListener(Event.COMPLETE, fileComplete);  
fileStream.addEventListener(IOErrorEvent.IO_ERROR, fileError); 
fileStream.open(newImage, FileMode.UPDATE);
fileStream.writeBytes(ba); 
fileStream.close();

这将确保在执行writeBytes()方法之前添加事件侦听器(并完成),以便调用事件处理程序。

但是,考虑一下你是否真的需要事件监听器。事件监听器(以及它们构建的“Observer”模式)通常是必须等待异步操作完成的解决方案。由于您只是使用同步写入,您可能甚至不需要它们。

答案 3 :(得分:0)

有一种方法可以写入applicationDirectory这里是hack。

var bmo:BitmapData = new BitmapData(150, 150, false, 0xFF0000); 
var bm:Bitmap = new Bitmap(bmo); 
addChild(bm);

var e:JPGEncoder = new JPGEncoder(100);
var ba:ByteArray = e.encode(bmo);

var f:File = new File(File.applicationDirectory.nativePath);
f= f.resolvePath("test.jpg");

var s:FileStream = new FileStream();  
s.open(f, FileMode.UPDATE);  
s.writeBytes(ba);
s.close();