Загрузить файл с помощью Adobe AIR - PullRequest
18 голосов
/ 05 декабря 2008

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

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

Ответы [ 5 ]

25 голосов
/ 06 декабря 2008

Вы хотите выбрать одну из 2 комбинаций API для этого.

Версия 1 - это URLLoader и FileStream

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

Версия 2 - это URLStream и FileStream

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

14 голосов
/ 26 ноября 2009

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

Это довольно просто. создайте 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
        }
    }
}}
7 голосов
/ 05 января 2009

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

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

}

Примечание. В этом решении используются Prototype и AIRAliases.js.

0 голосов
/ 18 мая 2011

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

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

0 голосов
/ 05 декабря 2008

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

...