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

18
задан skaffman 16 June 2010 в 19:07
поделиться

4 ответа

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

Версия 1 является URLLoader и FileStream

Используя эту комбинацию класса, Вы загрузили бы файл из своего сервера в к воздуху через объект URLLoader. Это загрузит файл в на память и затем уведомит Вас, когда загрузка будет завершена. Удостоверьтесь, что Вы инициируете загрузку с форматом данных URLLoaderDataFormat. ДВОИЧНЫЙ ФАЙЛ. Вы затем инициировали бы объект Filestream и выписали бы его к диску с помощью writeBytes ().

Версия 2 является URLStream, и FileStream

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

25
ответ дан 30 November 2019 в 06:42
поделиться

Для построения на второй идее 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.

7
ответ дан 30 November 2019 в 06:42
поделиться

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

0
ответ дан 30 November 2019 в 06:42
поделиться

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

Это довольно просто. создайте 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
        }
    }
}}
14
ответ дан 30 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: