2008-12-05 4 views
17

Как загрузить файл из Интернета в приложении AIR на основе Flex.Загрузить файл с Adobe AIR

Я пробовал использовать файл с url, установленным по адресу, но я получил файл не существует ошибки, когда я пытался его сохранить. И очень сложно Google помочь в этой проблеме.

ответ

25

Вы хотите выбрать из 2 api combos, чтобы выполнить это.

Version 1 является URLLoader и FileStream

Используя эту комбинацию класса, вы бы загрузить файл с сервера, чтобы воздух через объект URLLoader. Это загрузит файл в память и затем уведомит вас о завершении загрузки. Убедитесь, что вы запускаете загрузку с помощью dataFormat URLLoaderDataFormat.BINARY. Затем вы инициируете объект Filestream и записываете его на диск с помощью writeBytes().

Version 2 является URLStream и FileStream

URLStream очень похож на URLLoader, но вместо того, чтобы ждать файла, чтобы полностью загрузить перед использованием результата, данные становятся доступными для вас во время загрузки. Этот метод хорошо работает для больших файлов, потому что вам не нужно ждать полной загрузки, чтобы начать сохранение его на диск, и вы также сохраняете память, поскольку, как только игрок передает ее вам, он может освободить память, связанную с этими данными , Вы бы точно так же использовали бы поток filestream, вы просто закончили бы делать writeBytes() на каждом фрагменте файла по мере его потока.

+1

Я хочу добавить: 1. Если мы загрузим файл с URLStream и не напишем его в файл с FileStream, размер приложения увеличится до размера загружаемого файла. Но если мы читаемBytes из потока и записываем их в файл - все в порядке. Приложение не растет. Чтобы получить размер приложения, используйте System.privateMemory. – yozhik 2011-11-03 15:28:13

+0

@Seanalltogether, Можете ли вы привести пример этого, но не используя пакет? – 2012-08-20 02:09:59

0

Проверьте класс flash.net.URLRequest, который поможет вам скачать файл.

7

Чтобы построить вторую идею seanalltogether, вот функция, которая должна скачать файл из интернета, и сохранить его на диске (в указанном имени файла на рабочем столе):

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

} 

Примечание: Это решение использует прототип и AIRAliases.js.

14

Я использовал ответ seanalltogether и написал этот класс для обработки загрузки файлов.

Это довольно просто. создайте var downloader = new FileDownloader("url", "Local/Path"); и позвоните по телефону downloader.load(), чтобы начать загрузку.

Он также поддерживает установку функции, которая будет вызываться, когда будет выполнена, и в точках во время загрузки. Передача функции onProgress - количество загруженных байтов. (Я не мог понять, как получить фракцию, так как я не мог понять, как запросить размер файла до его загрузки)

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

Пожалуйста, проверьте класс URLLoader для загрузки файлов. Отличным примером является здесь: http://www.adobe.com/devnet/air/flex/articles/exploring_file_capabilities.html

Это было очень быстро для меня, по сравнению с классом URLStream, который занимал много времени и много CPU для загрузки файлов.

Смежные вопросы