проблема такая - при выборе файла для аплоада часто не срабатывают события 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();