2008-12-05 30 views
17

Internet'ten Flex tabanlı bir AIR uygulamasında bir dosyayı nasıl indiririm.Adobe AIR ile bir dosya indirme

Adrese URL ile ayarlanmış bir dosya kullanmayı denedim, ancak kaydetmeyi denediğimde bir dosya hata almamış. Ve bu konuda yardım için google gerçekten zor. Dosyayı indirmek için size yardımcı olacak flash.net.URLRequest sınıfına bakın.

cevap

25

Bunu yapmak için 2 api kombinasyonundan birini seçmek istersiniz.

Sürüm 1 sınıfın Bu kombinasyonu kullanarak URLLoader ve FileStream

, sen URLLoader nesnesi yoluyla havaya da sunucudan dosya yüklemek olacaktır. Bu, dosyayı belleğe indirir ve indirme tamamlandığında size bildirir. İndirmeyi URLLoaderDataFormat.BINARY bir dataFormat ile başlattığınızdan emin olun. Daha sonra bir Filestream nesnesi başlatır ve bunu writeBytes() kullanarak diske yazarsınız.

Sürüm 2 URLStream ve FileStream

URLStream URLLoader çok benzer olduğunu, ancak bunun yerine tamamen sonucunu kullanmadan önce indirmek için dosya için bekleyen veri indirme işlemi sırasında size sunulmuştur. Bu yöntem büyük dosyalar için iyi çalışır çünkü tam yüklemeyi diske kaydetmeye başlaması için beklemek zorunda kalmazsınız ve aynı zamanda belleğe de kaydedersiniz. . Eğer tamamen aynı şekilde filestream kullanacaksınız, sadece dosya akışları içinde dosyanın her bir yığınında bir writeBytes() yapıyorsunuz.

+1

Eklemek istediklerim: 1. URLStream ile bir dosya yüklüyor ve FileStream ile dosyaya yazmazsak - uygulama boyutu yüklediğimiz dosyanın boyutuna büyür. Ama eğer akışı akıştan okuyor ve onları dosyaya yazarsak - tamam. Uygulama büyümüyor. Uygulama boyutunu almak için System.privateMemory kullanın. – yozhik

+0

@Seanalltogether, Buna bir örnek verebilir misiniz, bir paket kullanmıyor musunuz? –

0

Dosyayı indirmenize yardımcı olacak flash.net.URLRequest sınıfına bakın.

7

Şimdi ikinci fikrini oluşturmak için, burada bir internetten dosya ve (masaüstünde belirtilen dosya adında) diske kaydetmek:

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

} 

Not: Bu çözüm Prototip ve AIRAliases.js kullanır.

14

Seanalltogether'un yanıtını kullandım ve bu sınıfı dosya indirme işlemlerini yürütmek için yazdım.

Oldukça basit. Bir var downloader = new FileDownloader("url", "Local/Path"); oluşturun ve indirmeye başlamak için downloader.load() numaralı telefonu arayın.

Ayrıca, tamamlandığında ve indirme sırasında noktalarda çağrılacak bir işlev ayarlamayı da destekler. OnProgress işlevinin aktarılması, indirilmiş olan baytların sayısını.

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

Sahne 1, Katman 'Katman 1', Çerçeve 1, Satır 1 \t 1137: Yanlış sayıda bağımsız değişken. En fazla KODU KULLANILMIŞTIR: var downloader = new FileDownloader ("http://edvizenor.com/upload/php/files/ImmaculateMary.mp3", "happy"); downloader.load(); –

0

da dosyaları indirmek için URLLoader sınıfını kontrol edin (o indirilen önce dosyanın boyutunu sorgulamak için nasıl çözemedim beri, bir kısmını nasıl çözemedim). Mükemmel bir örnek şudur: http://www.adobe.com/devnet/air/flex/articles/exploring_file_capabilities.html

Bu benim için çok hızlı bir şekilde çalışıyordu; URLstream sınıfı, çağlar alıyordu ve bir sürü CPU dosya indiriyordu.