Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не вызываются события SELECT и CANCEL (http://www.flasher.ru/forum/showthread.php?t=108720)

Фломастер 27.02.2008 18:57

не вызываются события SELECT и CANCEL
 
проблема такая - при выборе файла для аплоада часто не срабатывают события SELECT и CANCEL. Или срабатывают, файл полностью грузится, но не срабатывает событие COMPLETE и браузер виснет. от чего это зависит так и не смог понять.

из-за чего такое может быть?

вот код класса, расширяющего стандартный FileReferenceList

Код:

package {
        import flash.events.*;
        import flash.net.FileReference;
        import flash.net.FileReferenceList;
        import flash.net.FileFilter;
        import flash.net.URLRequest;

        class MultiUploader extends FileReferenceList {
                private var uploadURL:URLRequest;
                private var pendingFiles:Array;
                public static var LIST_COMPLETE:String = "listComplete";
                public static var IO_ERROR:String = "error";
                public static var PROGRESS:String = "progress";

                public function MultiUploader(url:String) {
                        trace("MultiUploader.MultiUploader");
                        uploadURL = new URLRequest();
                        uploadURL.url = url;
                        initializeListListeners();
                }

                private function initializeListListeners():void {
                        trace("MultiUploader.initializeListListeners");
                        addEventListener(Event.SELECT, selectHandler);
                        addEventListener(Event.CANCEL, cancelHandler);
                }               
                private function doOnComplete():void {
                        trace("doOnComplete");
                        var event:Event = new Event(MultiUploader.LIST_COMPLETE);
                        dispatchEvent(event);
                }
                private function addPendingFile(file:FileReference):void {
                        trace("addPendingFile: name=" + file.name);
                        pendingFiles.push(file);
                        file.addEventListener(Event.OPEN, openHandler);
                        file.addEventListener(Event.COMPLETE, completeHandler);

                        file.addEventListener(ProgressEvent.PROGRESS, progressHandler);                               
                       
                        file.upload(uploadURL);
                }
                private function removePendingFile(file:FileReference):void {
                        for (var i:uint; i < pendingFiles.length; i++) {
                                if (pendingFiles[i].name == file.name) {
                                        pendingFiles.splice(i, 1);
                                        if (pendingFiles.length == 0) {
                                                doOnComplete();
                                        }
                                        return;
                                }
                        }
                }
                private function selectHandler(event:Event):void {
                        trace("selectHandler: " + fileList.length + " files");
                        pendingFiles = new Array();
                        var file:FileReference;
                        for (var i = 0; i < fileList.length; i++) {
                                file = FileReference(fileList[i]);
                                addPendingFile(file);
                        }
                }
                private function cancelHandler(event:Event):void {
                        //var file:FileReference = FileReference(event.target);
                        //trace("cancelHandler: name=" + file.name);
                        var event:Event = new Event(MultiUploader.IO_ERROR);
                        dispatchEvent(event);
                }
                private function progressHandler(event:ProgressEvent):void {
                        var file:FileReference = FileReference(event.target);
                        trace("progressHandler: name=" + file.name + " bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
                       
                        var outEvent:ProgressEvent = new ProgressEvent(MultiUploader.PROGRESS);
                        outEvent.bytesLoaded = event.bytesLoaded
                        outEvent.bytesTotal = event.bytesTotal                       
                        dispatchEvent(event);
                }
                private function completeHandler(event:Event):void {
                        var file:FileReference = FileReference(event.target);
                        trace("fileCompleteHandler: name=" + file.name);               
                       
                        dispatchEvent(event);
                        removePendingFile(file);
                }
               
               
               
               
        }
}

вот кусок кода, которым вызываю диалог загрузки
Код:

serverUploadScriptName = "http://upload.server/upload";
                        trace(serverUploadScriptName);
                        var multiUploader:MultiUploader = new MultiUploader(serverUploadScriptName);

                        multiUploader.browse();


DarkLight 27.02.2008 18:59

Классическая ошибка - Вы создаете экземпляр FileReference как локальную переменную, и он удаляется при выходе из функции, а потому события и не вызываются. Сделайте экземпляр FileReference, например, свойством в классе и все будет нормально.

Фломастер 27.02.2008 19:44

да, спасибо, для SELECT и CANCEL дело было именно в этом,
а вот почему COMPLETE не срабатывает?

Бармалей 27.02.2008 20:38

Видимо сервер не генерирует "HTTP status code of 200".

Gaen 28.02.2008 05:58

Цитата:

Сообщение от DarkLight
Классическая ошибка - Вы создаете экземпляр FileReference как локальную переменную, и он удаляется при выходе из функции, а потому события и не вызываются. Сделайте экземпляр FileReference, например, свойством в классе и все будет нормально.

Блин я что-то не могу врубиться как флэш управляет памятью. Вроде ж у него сборщик мусора, который удаляет переменные только когда на них перестаёт что-то ссылаться и они перестают быть связаны с общей областью видимости.
А локальные переменные таки удаляются сразу?
Где есть вразумительные объяснения?

terbooter 28.02.2008 07:58

http://www.flasher.ru/forum/showthread.php?t=107916


Часовой пояс GMT +4, время: 04:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.