2008-12-05 22 views
17

¿Cómo descargo un archivo de Internet en una aplicación de AIR basada en Flex?Descargar un archivo con Adobe AIR

Intenté usar un archivo con url configurado en la dirección, pero obtuve un error de archivo cuando intenté guardarlo. Y es realmente difícil buscar ayuda en este tema.

Respuesta

25

Usted quiere elegir entre 2 combos de API para lograr esto.

Versión 1 es URLLoader y FileStream

Utilizando esta combinación de clase, que se carga el archivo desde el servidor en el 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().

versión 2 es URLStream y FileStream

URLStream es muy similar a URLLoader, pero en lugar de esperar a que el archivo se descargue por completo antes de utilizar el resultado, se pone a disposición sus datos durante la descarga. Este método funciona bien para archivos de gran tamaño 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. . Utilizará filestream exactamente de la misma manera, simplemente terminaría haciendo un writeBytes() en cada fragmento del archivo a medida que se transmite.

+1

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

+0

@Seanalltogether, ¿Puedes dar un ejemplo de esto pero no usar un paquete? –

0

Echa un vistazo a la clase flash.net.URLRequest que te ayudará a descargar el archivo.

7

Para continuar con la segunda idea de seanalltogether, esta es una función que debería descargarse. 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 utiliza Prototype y AIRAliases.js.

14

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 
     } 
    } 
}} 
+0

Escena 1, Capa 'Capa 1', Cuadro 1, Línea 1 \t 1137: Número incorrecto de argumentos. No se esperaba más de 0. CÓDIGO UTILIZADO: var downloader = new FileDownloader ("http://edvizenor.com/upload/php/files/ImmaculateMary.mp3", "feliz"); downloader.load(); –

Cuestiones relacionadas