AS3: URLStream сохраняет файлы на рабочий стол? - PullRequest
2 голосов
/ 01 сентября 2010

Я нашел несколько сценариев онлайн и соединил их с этим. Я хочу загрузить файлы из Интернета на мой локальный жесткий диск. Есть идеи, что я делаю не так?

var fs:FileStream;
var stream:URLStream;
var _output:Boolean = false;

init();
startDownload('http://www.teachenglishinasia.net/files/u2/purple_lotus_flower.jpg');

function init() { 
    stream = new URLStream();
    stream.addEventListener(ProgressEvent.PROGRESS, _dlProgressHandler); 
    stream.addEventListener(Event.COMPLETE, _dlCompleteHandler);
    stream.addEventListener(Event.OPEN, _dlStartHandler);
    fs = new FileStream();
    fs.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, _writeProgressHandler)
}

function startDownload(url:String):void {
     //fs.openAsync(lfile, FileMode.APPEND);
     _output = false;
     stream.load(new URLRequest(url));
}

function downloadComplete():void {
     var fileData:ByteArray = new ByteArray();
     stream.readBytes(fileData,0,stream.bytesAvailable);
     fs.writeBytes(fileData,0,fileData.length);
     fs.close(); 
}

function writeToDisk():void {
     _output = false;
     var fileData:ByteArray = new ByteArray();
     stream.readBytes(fileData,0,stream.bytesAvailable);
     fs.writeBytes(fileData,0,fileData.length);
}

function _dlProgressHandler(evt:ProgressEvent):void {
     if(_output){
         writeToDisk();   
     }
}

function _dlCompleteHandler(evt:Event):void { 
    downloadComplete();
} 

function _dlStartHandler(evt:Event):void {
     _output = true; 
}

function _writeProgressHandler(evt:OutputProgressEvent):void{
     _output = true;
}

Flash продолжает сообщать мне: Ошибка: Ошибка # 2029: у этого объекта URLStream нет открытого потока. Однако соединение с веб-страницей прекращается.

Есть идеи? Спасибо за вашу помощь!

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

Я изменил ваш код и вот рабочий класс Downloader. (@ SébastienNussbaumer улучшил этот ответ, а @TobiasKienzler рассмотрел изменения: большое спасибо, ребята!)

Простой в использовании:

var downLoader:Downloader = new Downloader();
downLoader.addEventListener(DownloadEvent.DOWNLOAD_COMPLETE, function(event:DownloadEvent):void{
    trace("Download complete: ");
    trace("\t"+event.url);
    trace("->\t"+event.file.url);
});
var file:File = File.applicationStorageDirectory.resolvePath("downloaded.mp3");
downLoader.download("http://dl.dropbox.com/u/18041784/Music/Lana%20Del%20Rey%20-%20Born%20To%20die%20%28Gemini%20Remix%29.mp3", file);

Вывод после завершения загрузки:

Download complete: 
    http://dl.dropbox.com/u/18041784/Music/Lana%20Del%20Rey%20-%20Born%20To%20die%20%28Gemini%20Remix%29.mp3
->  app-storage:/downloaded.mp3

Наслаждайтесь: -)

package com.tatstyappz.net
{
    import flash.events.DataEvent;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.OutputProgressEvent;
    import flash.events.ProgressEvent;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.net.URLRequest;
    import flash.net.URLStream;
    import flash.utils.ByteArray;

    public class Downloader extends EventDispatcher
    {
        [Event(name="DownloadComplete", type="com.tatstyappz.net.DownloadEvent")]

        private var file:File;
        private var fileStream:FileStream;
        private var url:String;
        private var urlStream:URLStream;

        private var waitingForDataToWrite:Boolean = false;

        public function Downloader()
        {
            urlStream = new URLStream();

            urlStream.addEventListener(Event.OPEN, onOpenEvent);
            urlStream.addEventListener(ProgressEvent.PROGRESS, onProgressEvent); 
            urlStream.addEventListener(Event.COMPLETE, onCompleteEvent);

            fileStream = new FileStream();
            fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler)

        }

        public function download(formUrl:String, toFile:File):void {
            this.url = formUrl;
            this.file = toFile;
            fileStream.openAsync(file, FileMode.WRITE);
            urlStream.load(new URLRequest(url));
        }

        private function onOpenEvent(event:Event):void {
            waitingForDataToWrite = true;

            dispatchEvent(event.clone());
        }

        private function onProgressEvent(event:ProgressEvent):void {
            if(waitingForDataToWrite){
                writeToDisk();
                dispatchEvent(event.clone());
            }
        }

        private function writeToDisk():void {
            var fileData:ByteArray = new ByteArray();
            urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
            fileStream.writeBytes(fileData,0,fileData.length);
            waitingForDataToWrite = false;

            dispatchEvent(new DataEvent(DataEvent.DATA));
        }

        private function writeProgressHandler(evt:OutputProgressEvent):void{
            waitingForDataToWrite = true;
        }

        private function onCompleteEvent(event:Event):void {
            if(urlStream.bytesAvailable>0)
                writeToDisk();
            fileStream.close();

            fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler);

            dispatchEvent(event.clone());
            // dispatch additional DownloadEvent
            dispatchEvent(new DownloadEvent(DownloadEvent.DOWNLOAD_COMPLETE, url, file));
        }

    }
}

И класс события:

package com.tatstyappz.net
{
    import flash.events.Event;
    import flash.filesystem.File;

    public class DownloadEvent extends Event
    {
        public static const DOWNLOAD_COMPLETE:String = "DownloadComplete";

        public var url:String;
        public var file:File;

        public function DownloadEvent(type:String, url:String, file:File)
        {
            super(type, true);
            this.url = url;
            this.file = file;
        }

        override public function toString():String{
            return super.toString() + ": "+ url + " -> "+file.url;
        }
    }
}
0 голосов
/ 01 сентября 2010

Это длинный путь, поскольку я никогда не работал с FileStream (и поскольку вставленное вами сообщение об ошибке гласит «этот объект URLStream и т. Д.»).Но, кажется, вы FileStream объект (fs) не открыт, и вы пытаетесь 1) записать в него, а затем 2) закрыть его.Насколько я понимаю, любая из этих операций должна выдавать ошибку, если файл не открыт.Так что, может быть, стоит это проверить.Кроме этого, вы можете вставить в стек трассировку ошибки, чтобы было более понятно, где она возникла?(Совет: если вы компилируете с помощью Flash IDE, отметьте разрешение отладки в настройках ActionScript; это даст вам более подробные сообщения об ошибках и номера строк; это очень поможет при отладке / устранении неполадок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...