【问题标题】:Is it possible to download and save file using adobe air?是否可以使用 adobe air 下载和保存文件?
【发布时间】:2012-03-24 18:07:33
【问题描述】:

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

提前谢谢....

【问题讨论】:

    标签: flash air download directory local


    【解决方案1】:

    URLRequest 和 URLLoader 将允许您从 Internet 获取一些数据,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 它有一个值并且它似乎已经保存没有错误,不幸的是它在我的根 /data 文件夹中,因为我没有没有我的手机植根我无法完全确认文件确实存在但没有错误。让我知道您是否尝试过此操作以及您仍然遇到哪些具体问题。

    【讨论】:

    • 感谢他的帮助,但我正在使用此代码进行闪存,我已尽一切努力使闪存适合但没有工作。如果您知道如何使此代码适合闪存,请帮助..跨度>
    • 嘿 Pabo,除了作为容器的应用程序和使用创建完成事件之外,我认为我并没有真正依赖 Flex 中的任何东西来工作,它应该都可以在 Flash 中使用...我将制作一个 Flash 移动项目并将其放入其中以查看是否有任何问题,我唯一能想到的可能是使用文件引用的问题,因为我不知道它是如何工作的在移动平台上,通常它会请求特定于操作系统的弹出窗口来选择要保存的文件或位置,但我知道在 Android 或 iOS 上没有内置文件系统浏览器。
    • 我更新了我的答案,还要注意我在创建项目时检查了允许写入外部存储,以便将其添加到 -app.xml 文件并最终添加到设备上安装的 apk。跨度>
    • shaunhusain,非常感谢您的帮助。您的代码在我的安卓手机上运行。但问题是我正在制作杂志应用程序,当人们点击更新按钮时,图像需要自动下载,而不询问文件需要保存的位置。你的代码很棒,我还不能做这么多,但是问题是我不想要那个需要保存文件的对话框吗?如果知道该怎么做,请帮忙。非常感谢您的帮助
    • 如果删除 FileReference 部分不会提示用户,那么下一步就是确定如何将文件保存到要保存的位置,是否要直接将其保存到图片文件夹或其他位置,基本上您可以使用 FileStream 保存任何位置而无需提示用户,但是您只需要弄清楚如何使用 File 类静态属性(最有可能)来获取该路径。那么您要将数据保存到的具体文件夹是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多