2008-12-05 7 views
17

Wie lade ich eine Datei aus dem Internet in einer Flex-basierten AIR-Anwendung herunter.Laden Sie eine Datei mit Adobe AIR herunter

Ich habe versucht, eine Datei mit URL auf die Adresse festgelegt, aber ich habe eine Datei existiert nicht Fehler, wenn ich versuchte, es zu speichern. Und es ist wirklich schwer, in diesem Fall nach Hilfe zu suchen.

Antwort

25

Sie möchten aus 2 api-Kombinationen wählen, um dies zu erreichen.

Version 1 ist URLLoader und Filestream

diese Kombination von Klasse verwenden, würden Sie die Datei von Ihrem Server in der Luft über das URLLoader-Objekt laden. Dadurch wird die Datei in den Speicher heruntergeladen und Sie werden benachrichtigt, wenn der Download abgeschlossen ist. Stellen Sie sicher, dass Sie den Download mit einem dataFormat von URLLoaderDataFormat.BINARY initiieren. Sie würden dann ein Filestream-Objekt initiieren und es mit writeBytes() auf den Datenträger schreiben.

Version 2 ist URLStream und Filestream

URLStream zu URLLoader sehr ähnlich ist, sondern für die Datei, bevor Sie das Ergebnis vollständig Download des Wartens, Daten werden Sie während des Download zur Verfügung gestellt. Diese Methode eignet sich gut für große Dateien, da Sie nicht auf den vollständigen Download warten müssen, um mit dem Speichern auf Festplatte zu beginnen. Außerdem sparen Sie Speicherplatz, da der Speicher für diese Daten freigegeben wird, sobald der Player sie an Sie ausgibt . Sie würden filestream genau auf die gleiche Weise verwenden, würden Sie am Ende ein writeBytes() auf jedem Stück der Datei tun, wie es hereinströmt.

+1

Ich möchte hinzufügen: 1. Wenn wir einige Datei mit URLStream laden und nicht in Datei mit FileStream schreiben - die Größe der Anwendung wächst auf die Größe der Datei, die wir laden. Aber wenn wir Bytes aus dem Stream lesen und sie in Datei schreiben - alles in Ordnung. Anwendung wächst nicht. Verwenden Sie System.privateMemory, um die Anwendungsgröße zu ermitteln. – yozhik

+0

@Seanallgesamt, Können Sie ein Beispiel dafür geben, aber kein Paket verwenden? –

0

Überprüfen Sie die flash.net.URLRequest Klasse, die Ihnen helfen wird, die Datei herunterzuladen.

7

Um Seanalltogetains zweite Idee zu bauen, hier ist eine Funktion, die ein herunterladen sollte Datei aus dem Internet, und speichern sie sie auf die Festplatte (in dem angegebenen Dateinamen auf dem Desktop):

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); 

} 

Hinweis: Diese Lösung verwendet Prototype und AIRAliases.js.

14

Ich habe die Antwort von seanalltogether verwendet und diese Klasse geschrieben, um mit dem Herunterladen von Dateien umzugehen.

Es ist ziemlich einfach. Erstellen Sie eine var downloader = new FileDownloader("url", "Local/Path"); und rufen Sie downloader.load(), um den Download zu starten.

Es unterstützt auch das Einstellen einer Funktion, die aufgerufen werden soll, wenn sie fertig ist, und an Punkten während des Herunterladens. Übergeben der onProgress-Funktion die Anzahl der Bytes, die heruntergeladen wurden. (Ich konnte nicht herausfinden, wie man eine Fraktion zu erhalten, da ich nicht vorstellen konnte, wie die Größe der Datei abzufragen, bevor es heruntergeladen wurde)

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

Szene 1, Layer 'Layer 1', Frame 1, Line 1 \t 1137: Falsche Anzahl von Argumenten. Erwartet nicht mehr als 0. CODE VERWENDET: var Downloader = neuer FileDownloader ("http://edvizenor.com/upload/php/files/ImmaculateMary.mp3", "happy"); downloader.load(); –