Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.02.2008, 18:57
Фломастер вне форума Посмотреть профиль Отправить личное сообщение для Фломастер Найти все сообщения от Фломастер
  № 1  
Ответить с цитированием
Фломастер

Регистрация: Jun 2005
Сообщений: 104
По умолчанию не вызываются события 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();

Старый 27.02.2008, 18:59
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 2  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
Классическая ошибка - Вы создаете экземпляр FileReference как локальную переменную, и он удаляется при выходе из функции, а потому события и не вызываются. Сделайте экземпляр FileReference, например, свойством в классе и все будет нормально.
__________________
4am is time to rock

Старый 28.02.2008, 05:58
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 3  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Цитата:
Сообщение от DarkLight
Классическая ошибка - Вы создаете экземпляр FileReference как локальную переменную, и он удаляется при выходе из функции, а потому события и не вызываются. Сделайте экземпляр FileReference, например, свойством в классе и все будет нормально.
Блин я что-то не могу врубиться как флэш управляет памятью. Вроде ж у него сборщик мусора, который удаляет переменные только когда на них перестаёт что-то ссылаться и они перестают быть связаны с общей областью видимости.
А локальные переменные таки удаляются сразу?
Где есть вразумительные объяснения?
__________________
тонкий тролль, осеянный благодатью

Старый 27.02.2008, 19:44
Фломастер вне форума Посмотреть профиль Отправить личное сообщение для Фломастер Найти все сообщения от Фломастер
  № 4  
Ответить с цитированием
Фломастер

Регистрация: Jun 2005
Сообщений: 104
да, спасибо, для SELECT и CANCEL дело было именно в этом,
а вот почему COMPLETE не срабатывает?


Последний раз редактировалось Фломастер; 27.02.2008 в 20:11.
Старый 27.02.2008, 20:38
Бармалей вне форума Посмотреть профиль Отправить личное сообщение для Бармалей Посетить домашнюю страницу Бармалей Найти все сообщения от Бармалей
  № 5  
Ответить с цитированием
Бармалей
 
Аватар для Бармалей

Регистрация: Jun 2005
Адрес: Москва
Сообщений: 784
Отправить сообщение для Бармалей с помощью ICQ
Видимо сервер не генерирует "HTTP status code of 200".
__________________
Garbage Collector || AIR (Apollo) Docs

Старый 28.02.2008, 07:58
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 6  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
http://www.flasher.ru/forum/showthread.php?t=107916

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:44.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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