URLStream выдает ошибку # 2029 в моем приложении flex AIR - PullRequest
0 голосов
/ 02 ноября 2010

В моем приложении AIR я пытаюсь реализовать загрузчик файлов, используя URLStream.

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(loaded:Number, total:Number):void{};
        public var onComplete :Function = function():void{};
        public var remotePath :String = "";
        public var localFile :File = null; 
        public var running:Boolean = false;

        public 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 
        {
            try
            {
                stream = null;
                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();
                            running = false;
                            onComplete();
                        }
                    });


                    fileAccess.openAsync( localFile, FileMode.WRITE );

                    fileAccess.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent)
                    {
                        trace('remotePath: '+remotePath);
                        trace('io error while wrintg ....'+e.toString());
                    });

                    stream.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent)
                    {
                        trace('remotePath: '+remotePath);
                        trace('There was an IO error with the stream: '+e.text);
                    });

                    stream.addEventListener( "progress" , function (e:ProgressEvent) :void {
                        var bytes :ByteArray = new ByteArray();
                        var thisStart :uint = currentPosition;
                        currentPosition += stream.bytesAvailable;
                        // ^^  Makes sure that asyncronicity does not break anything

                        try
                        {
                            //trace('reading from '+remotePath+' ...');
                            stream.readBytes( bytes, thisStart );
                            fileAccess.writeBytes( bytes, thisStart );
                        }
                        catch(err:Error)
                        {
                            trace('remotePath: '+remotePath);
                            trace('error while writing bytes from...'+err.name+':'+err.message);
                            if(stream.connected)
                                stream.close();

                            abort();
                            onComplete();
                            return;
                        }

                        onProgress( e.bytesLoaded, e.bytesTotal );                                          
                    });

                    stream.addEventListener( "complete", function () :void {
                        downloadCompleteFlag = true;
                    });

                    stream.load( requester );

                } else {
                    // Do something unspeakable
                }
                running = true;
            }
            catch(err:Error)
            {
                trace('error while downloading the file: '+err);
            }
        }

        public function abort():void {
            try {
                stream.close();
                trace('stream closed');
                running = false;
            }
            catch(err:Error) {
                trace('error while aborting download');
                trace(err);
            }
        }
    }

Я просто создаю объект вышеупомянутого класса, передаю URL и файл и вызываю функцию загрузки.Для некоторых файлов я получаю следующую ошибку:

remotePath: http://mydomain.com/238/6m_608-450.jpg
error while writing bytes from...Error:Error #2029: This URLStream object does not have a stream opened.

Это означает, что ошибка происходит из потока файлов (fileAccess), который я использую.Я не могу понять, почему это может происходить.Если я пытаюсь открыть URL-адрес http://mydomain.com/238/6m_608-450.jpg в браузере, он открывается правильно.Это происходит случайным образом для некоторых файлов.В чем может быть проблема?

1 Ответ

1 голос
/ 05 ноября 2010

Я пытался в моем офисе, и он работает для меня (для разных файлов и размер файла).Итак, можете ли вы описать файлы (или типы файлов), которые не работают для вас (опубликуйте URL, если можете)?Я бы сказал, что когда вы используете метод readBytes, ваш поток (так что URLStream) всегда близок.

Более того, я даю мне несколько советов: 1 / Используйте константы flash вместо простой строки 2 / Не забудьтеудалить слушателей после завершения операции 3 / Ваш метод FileDownloader довольно запутанный.Используйте строчные буквы, если это функция, или вводите заглавную букву с именем класса, если вы используете его в качестве конструктора.Для меня эта функция должна быть конструктором.

...