examples - flex sdk installer
Descargue un archivo con Adobe AIR (5)
Mira la clase flash.net.URLRequest
que te ayudará a descargar el archivo.
¿Cómo descargo un archivo de Internet en una aplicación de AIR basada en Flex?
Intenté usar un archivo con la url establecida en la dirección, pero obtuve un error de archivo cuando intenté guardarlo. Y es realmente difícil buscar ayuda en este tema.
Desea elegir entre 2 combinaciones de API para lograr esto.
La versión 1 es URLLoader y FileStream
Usando esta combinación de clase, cargaría el archivo de su servidor al aire a través del objeto URLLoader. Esto descargará el archivo en la memoria y luego le notificará cuando se complete la descarga. Asegúrese de iniciar la descarga con un dataFormat de URLLoaderDataFormat.BINARY. Luego iniciaría un objeto Filestream y lo escribiría en el disco usando writeBytes ().
La versión 2 es URLStream y FileStream
URLStream es muy similar a URLLoader, pero en lugar de esperar que el archivo se descargue por completo antes de utilizar el resultado, los datos se ponen a su disposición durante la descarga. Este método funciona bien para archivos grandes porque no tiene que esperar a que la descarga completa comience a guardarlo en el disco, y también guarda en la memoria ya que una vez que el jugador se la entrega puede liberar la memoria relacionada con esa información. . Usarás filestream exactamente de la misma manera, terminarías escribiendo writeBytes () en cada fragmento del archivo a medida que se transmite.
Para aprovechar la segunda idea de seanalltogether, aquí hay una función que debe descargar un archivo de Internet y guardarlo en el disco (en el nombre de archivo especificado en el escritorio):
downloadFile: function (url, fileName) {
var urlStream = new air.URLStream();
var request = new air.URLRequest(url);
var fileStream = new air.FileStream();
// write 50k from the urlstream to the filestream, unless
// the writeAll flag is true, when you write everything in the buffer
function writeFile(writeAll) {
if (urlStream.bytesAvailable > 51200 || writeAll) {
alert("got some");
var dataBuffer = new air.ByteArray();
urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable);
fileStream.writeBytes(dataBuffer, 0, dataBuffer.length);
}
// do clean up:
if (writeAll) {
alert("done");
fileStream.close();
urlStream.close();
// set up the next download
setTimeout(this.downloadNextFile.bind(this), 0);
}
}
urlStream.addEventListener(air.Event.COMPLETE, writeFile.bind(this, true));
urlStream.addEventListener(air.ProgressEvent.PROGRESS, writeFile.bind(this, false));
var file = air.File.desktopDirectory.resolvePath(fileName);
fileStream.openAsync(file, air.FileMode.WRITE);
urlStream.load(request);
}
Nota: Esta solución usa Prototype y AIRAliases.js.
Usé la respuesta de seanalltogether y escribí esta clase para manejar la descarga de archivos.
Es bastante simple. crear un var downloader = new FileDownloader("url", "Local/Path");
y llama a downloader.load()
para iniciar la descarga.
También es compatible con la configuración de una función que se llamará cuando haya terminado, y en los puntos durante la descarga. Al pasar la función onProgress, la cantidad de bytes que se han descargado. (No pude averiguar cómo obtener una fracción, ya que no pude encontrar la manera de consultar el tamaño del archivo antes de que se descargara)
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
}
}
}}
Verifique también la clase URLLoader para descargar archivos. Un excelente ejemplo está aquí: http://www.adobe.com/devnet/air/flex/articles/exploring_file_capabilities.html
Esto resultó ser muy rápido para mí, en comparación con la clase URLStream, que estaba demorando años, y una gran cantidad de CPU para descargar archivos.