UrlStream intermittent pausing, slowing, waiting?
Hi,
I have been trying to use the UrlStream to download many files and even single large files. While downloading a single large file it seems to pause mid stream and then burst back in to life and then pause again and so on. The same occurs if I use to download many smaller files. Some will randomly pause.
Is this a bug? Anyone else having this problem? Is there a fix?
package com.layoutmanager.stage
{
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
{
private var file:File;
private var fileStream:FileStream;
private var request:URLRequest;
private var urlStream:URLStream;
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(fromRequest:URLRequest, toFile:File):void {
trace("Start Download");
this.request = fromRequest;
this.file = toFile;
try
{
fileStream.open(file, FileMode.WRITE);
urlStream.load(request);
}
catch(error:Error) {
//Ignore Error
trace(error);
}
}
private function onOpenEvent(event:Event):void {
dispatchEvent(event.clone());
}
private function onProgressEvent(event:ProgressEvent):void {
writeToDisk();
dispatchEvent(event.clone());
}
private function writeToDisk(force:Boolean = false):void {
if(!force || urlStream.bytesAvailable > 51200)
{
trace("Progress");
var fileData:ByteArray = new ByteArray();
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
fileStream.writeBytes(fileData,0,fileData.length);
fileData = null;
}
dispatchEvent(new DataEvent(DataEvent.DATA));
}
private function writeProgressHandler(evt:OutputProgressEvent):void{
}
private function onCompleteEvent(event:Event):void {
if(urlStream.bytesAvailable > 0)
writeToDisk(true);
fileStream.close();
trace("Download Finished");
fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler);
dispatchEvent(event.clone());
}
}
}
