flex - 사용법 - 어도비 에어 란




Adobe AIR를 사용하여 파일 다운로드 (4)

파일을 다운로드하는 데 도움이되는 flash.net.URLRequest 클래스를 확인하십시오.

Flex 기반 AIR 응용 프로그램에서 인터넷에서 파일을 다운로드하려면 어떻게합니까?

주소로 설정된 URL을 사용하여 파일을 사용하려했지만 파일을 저장하려고 할 때 파일이 존재하지 않습니다. 그리고이 문제에 대한 도움이 Google에 정말 어렵습니다.


이것을 달성하기 위해 2 가지 api 콤보 중에서 선택하고 싶습니다.

버전 1은 URLLoader 및 FileStream입니다.

이 클래스의 조합을 사용하면 URLLoader 객체를 통해 서버에서 파일을 불러올 수 있습니다. 이렇게하면 파일이 메모리로 다운로드 된 다음 다운로드가 완료되면 알려줍니다. URLLoaderDataFormat.BINARY의 dataFormat을 사용하여 다운로드를 시작해야합니다. writeBytes ()를 사용하여 Filestream 객체를 초기화하고 디스크에 기록합니다.

버전 2는 URLStream 및 FileStream입니다.

URLStream은 URLLoader와 매우 비슷하지만 결과를 사용하기 전에 파일이 완전히 다운로드 될 때까지 기다리는 대신 다운로드 중에 데이터를 사용할 수 있습니다. 이 방법은 대용량 파일에 적합합니다. 전체 다운로드가 디스크에 저장되기를 기다릴 필요가 없기 때문에 플레이어가 손에 넣은 후에도 해당 데이터와 관련된 메모리를 해제 할 수 있기 때문에 메모리에 저장하기 때문입니다 . 당신은 똑같은 방법으로 filestream을 사용할 것이고, 스트림으로 들어올 때 파일의 각 청크에 writeBytes ()를 수행하게 될 것입니다.


나는 seanalltogether의 대답을 사용했고 파일 다운로드를 처리하기 위해이 클래스를 작성했습니다.

그것은 꽤 간단합니다. var downloader = new FileDownloader("url", "Local/Path"); downloader.load() 를 시작하려면 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
        }
    }
}}