Подтвердить что ты не робот

Загрузите файл с Adobe AIR

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

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

4b9b3361

Ответ 1

Вы хотите выбрать из 2 api комбо для выполнения этого.

Версия 1 - URLLoader и FileStream

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

Версия 2 - URLStream и FileStream

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

Ответ 2

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

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

Ответ 3

Чтобы построить вторую концепцию 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);

}

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

Ответ 4

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

Ответ 5

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

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