是否可以使用adobe air下载和保存文件?

时间:2012-03-24 18:07:34

标签: flash air download directory local

我为android制作了一个flash air应用程序,我需要下载文件并保存到应用程序本地目录

提前致谢....

1 个答案:

答案 0 :(得分:6)

URLRequest和URLLoader将允许您从互联网上获取一些数据,FileStream允许您在本地保存它(FileReference,如果您希望它们选择保存位置),如

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       creationComplete="windowedapplication1_creationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub
                var urlLoader:URLLoader = new URLLoader();
                urlLoader.addEventListener(Event.COMPLETE, complete_handler);
                urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                urlLoader.load(new URLRequest("http://www.shaunhusain.com/CheckboxList/CheckboxList.swf"));

            }

            private function complete_handler(event:Event):void
            {
                var data:ByteArray = event.target.data;

                var fr:FileReference = new FileReference();
                fr.save(data, 'test.swf');

                var fileStream:FileStream = new FileStream();
                trace(File.applicationDirectory.nativePath);
                fileStream.open(new File(File.applicationDirectory.nativePath+"\\test.swf"),FileMode.WRITE);
                fileStream.writeBytes(data, 0, data.length);
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
</s:WindowedApplication>

修改 AS3移动项目版本:

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.net.FileReference;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;

    public class DownloadFileMobileAS3 extends Sprite
    {
        public function DownloadFileMobileAS3()
        {
            super();

            // support autoOrients
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            createLoader();
        }
        protected function createLoader():void
        {
            // TODO Auto-generated method stub
            var urlLoader:URLLoader = new URLLoader();
            urlLoader.addEventListener(Event.COMPLETE, complete_handler);
            urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
            urlLoader.load(new URLRequest("http://www.shaunhusain.com/CheckboxList/CheckboxList.swf"));

        }

        private function complete_handler(event:Event):void
        {
            var data:ByteArray = event.target.data;

            var fr:FileReference = new FileReference();
            fr.save(data, 'test.swf');

            var fileStream:FileStream = new FileStream();
            trace("something");
            trace(File.applicationDirectory);
            trace(File.applicationDirectory.nativePath);
            trace(File.applicationStorageDirectory.nativePath);
            fileStream.open(new File(File.applicationStorageDirectory.nativePath+"\\test.swf"),FileMode.WRITE);
            fileStream.writeBytes(data, 0, data.length);
        }
    }
}

我在上面的代码中包含了两个选项,你想要取出文件引用部分或取出文件流部分,否则它将被保存两次。

我刚刚添加了移动部分,它实际上确实有某种对话框,它会提示您在Android上保存文件,虽然它是我以前从未见过的对话框,只是为您提供了保存位置的选项它和音频文件,图像文件和视频文件作为选项或/mnt/sdcard/test.swf中的默认位置。我让它保存在那里,并且能够使用ES Explorer看到它(虽然我没有办法验证数据是否正常,但通常看起来是正确的)。使用applicationDirectory的那个失败了我,追踪它我没有看到nativePath所以我把它切换到applicationStorageDirectory有一个值,它似乎保存没有错误,不幸的是它在我的根/数据文件夹中,因为我不'让我的手机扎根我无法完全确认文件实际存在但没有错误。如果你已经尝试了这个以及你仍然遇到的具体问题,请告诉我。