![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 104
|
проблема такая - при выборе файла для аплоада часто не срабатывают события 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);
}
}
}
|
|
|||||
|
ветеран форума
|
Классическая ошибка - Вы создаете экземпляр FileReference как локальную переменную, и он удаляется при выходе из функции, а потому события и не вызываются. Сделайте экземпляр FileReference, например, свойством в классе и все будет нормально.
__________________
4am is time to rock |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 104
|
да, спасибо, для SELECT и CANCEL дело было именно в этом,
а вот почему COMPLETE не срабатывает? Последний раз редактировалось Фломастер; 27.02.2008 в 20:11. |
|
|||||
|
Видимо сервер не генерирует "HTTP status code of 200".
|
|
|||||
|
strange mood
|
Цитата:
А локальные переменные таки удаляются сразу? Где есть вразумительные объяснения?
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
__________________
Сам себе репортер |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|