AS3: URLStream сохраняет файлы на рабочий стол?

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

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 не имеет открытого потока. Однако соединение с веб-страницей обрывается.

Любые идеи? Спасибо за помощь!


person matt    schedule 01.09.2010    source источник


Ответы (2)


Я изменил ваш код, и вот рабочий класс 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;
        }
    }
}
person Pascal    schedule 20.12.2011
comment
@SébastienNussbaumer Вы должны были оставить комментарий, чтобы Паскаль узнал об этом - person Tobias Kienzler; 06.08.2013
comment
Привет, кто-то только что пытался изменить ответ об исправленной ошибке: ожиданиеForDataToWrite всегда было ложным, событие прогресса не отправлялось, и загруженный файл полностью помещался в память. Но он, вероятно, был отклонен (не мной). Не стесняйтесь присылать мне обновленный код, чтобы я мог изменить себя (и указать автора) pascal.dalfarra[at]gmail.com - person Pascal; 06.08.2013
comment
Вы имеете в виду этот? Оно было принято, хотя для меня это звучало достаточно сурово, чтобы я предпочел обсуждение с вами, а не прямое одобрение. Если это продолжение, к сожалению, отклоненные предложения почти невозможно найти, кроме как в очереди на проверку. Вот еще один, также от @Sébastien, который был отклонен ранее: stackoverflow.com/review/suggested-edits/2662084 - person Tobias Kienzler; 06.08.2013
comment
@Tobias: попался, я колебался ... Я буду комментировать в будущем. - person Sébastien Nussbaumer; 06.08.2013
comment
@Pascal: важная модификация принята. (с двумя следующими изменениями: в Downloader.download в измененном fileStream.open на fileStream.openAsync, а в Downloader.onOpenEvent я изменил ожиданиеForDataToWrite с false на true). Было еще одно незначительное редактирование, которое было отклонено (не знаю почему, может быть, потому что я сделал два редактирования), я просто удалил import.flash.media.Sound в DownloadEvent, который был ненужным, так что на самом деле совсем не важен ... - person Sébastien Nussbaumer; 06.08.2013
comment
@SébastienNussbaumer и @TobiasKienzler Большое спасибо за вашу работу над этим. Итак, теперь код работает нормально. КР, Паскаль - person Pascal; 06.08.2013
comment
@Pascal Паскаль. Вы не должны меня благодарить, я фактически проголосовал за отклонение этого редактирования, так как думал, что превращение ложного в истинное не должно происходить без обсуждения ... - person Tobias Kienzler; 06.08.2013

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

person Juan Pablo Califano    schedule 01.09.2010