2010-09-01 4 views
2

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

Любые идеи? Благодарим за помощь!

ответ

5

Я изменил ваш код и вот рабочий класс 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

@ SébastienNussbaumer Вы должны были оставить комментарий, чтобы Pascal знать об этом –

+0

Привете, кто-то просто попытались изменить ответ о «исправленной ошибке: waitingForDataToWrite всегда были ложными, событие прогресса не будет послано, и загруженный файл будет полностью в памяти ». Но это, вероятно, было отвергнуто (не мной). Не стесняйтесь присылать мне обновленный код, поэтому я могу изменить себя (и заверить автора) pascal.dalfarra [at] gmail.com – Pascal

+0

Вы имеете в виду [этот] (http://stackoverflow.com/review/spected-edits/2662320)? Это было принято, хотя для меня это звучало достаточно серьезно, чтобы предпочесть дискуссию с вами, а не прямо одобрять ее. Если это результат, к сожалению, отклоненные предложения почти невозможно найти, кроме как в очереди просмотра. Вот еще один из них: @ Sébastien, который был отклонен до: http://stackoverflow.com/review/spected-edits/2662084 –

0

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

Смежные вопросы