Utilicé la respuesta de seanalltogether y escribí esta clase para gestionar la descarga de archivos.
Es bastante simple. cree un var downloader = new FileDownloader("url", "Local/Path");
y llame al downloader.load()
para comenzar la descarga.
También es compatible con la configuración de una función que se llamará cuando se realice, y en los puntos durante la descarga. Al pasar la función onProgress, la cantidad de bytes que se han descargado. (No pude encontrar la manera de obtener una fracción, ya que no podía encontrar la manera de consultar el tamaño del archivo antes de que se descargó)
package com.alex{
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 FileDownloader
{
// Class to download files from the internet
// Function called every time data arrives
// called with an argument of how much has been downloaded
public var onProgress :Function = function(t:uint):void{};
public var onComplete :Function = function():void{};
public var remotePath :String = "";
public var localFile :File = null;
private var stream :URLStream;
private var fileAccess :FileStream;
public function FileDownloader(remotePath :String = "" , localFile :File = null) {
this.remotePath = remotePath;
this.localFile = localFile;
}
public function load() :void {
if(!stream || !stream.connected) {
stream = new URLStream();
fileAccess = new FileStream();
var requester :URLRequest = new URLRequest(remotePath);
var currentPosition :uint = 0;
var downloadCompleteFlag :Boolean = false;
// Function to call oncomplete, once the download finishes and
// all data has been written to disc
fileAccess.addEventListener("outputProgress", function (result) :void {
if(result.bytesPending == 0 && downloadCompleteFlag) {
stream.close();
fileAccess.close();
onComplete();
}
});
fileAccess.openAsync(localFile, FileMode.WRITE);
stream.addEventListener("progress" , function() :void {
var bytes :ByteArray = new ByteArray();
var thisStart :uint = currentPosition;
currentPosition += stream.bytesAvailable;
// ^^ Makes sure that asyncronicity does not break anything
stream.readBytes(bytes, thisStart);
fileAccess.writeBytes(bytes, thisStart);
onProgress(currentPosition);
});
stream.addEventListener("complete", function() :void {
downloadCompleteFlag = true;
});
stream.load(requester);
} else {
// Do something unspeakable
}
}
}}
Quiero agregar: 1. Si cargamos algún archivo con URLStream y no lo escribimos en un archivo con FileStream, el tamaño de la aplicación crece hasta el tamaño del archivo que cargamos. Pero si leemos Bytes de la secuencia y los escribimos en el archivo, todo está bien. La aplicación no crece. Para obtener el tamaño de la aplicación use System.privateMemory. – yozhik
@Seanalltogether, ¿Puedes dar un ejemplo de esto pero no usar un paquete? –