Имя файла только что загруженного файла через FileReference недоступно - PullRequest
0 голосов
/ 10 ноября 2009

Чтобы загрузить 3 файла локально во Flash Player, можно использовать что-то вроде этого для управления последовательностью после выбора файлов пользователем ...

    private function uploadList(evt:Event):void{

        var arr:Array = fileReferenceList.fileList;

        for each(var item:FileReference in arr){
            item.addEventListener(Event.COMPLETE, onFileLoadComplete);
            item.load();
        }

    }

// Шаг 2 - загрузите файл и дождитесь шага 3 ... в этом случае использования он будет вызван три раза.

    private function onFileLoadComplete(e:Event):void {

        var loader:Loader = new Loader();

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDataLoadComplete);
        loader.loadBytes(FileReference(e.target).data);
    }

// Шаг 3 - Flash Player загрузил файл и готов к обработке ... // этот пример - изображение, вставляемое в объект BitmapData ...

private function onDataLoadComplete(e:Event):void {
        var bitmapData:BitmapData = Bitmap(e.target.content).bitmapData;
        var loader:Loader = Loader(e.target.loader);

...

}

// Шаг 4 - Где находится имя файла и размер файла в байтах для каждого файла, проходящего через Шаг 3?

Мне не удалось найти эти данные в существующих объектах.

Мое разрешение ...

Я помещаю информацию в простой словарь и получаю ее позже.

Возможно, есть другие решения?

private function onFileLoadComplete(e:Event):void {

        if(FileReference(e.target).data.length == 0){
            return;
        }           

        var loader:Loader = new Loader();
        filenameDict[loader] = String(FileReference(e.target).name);

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDataLoadComplete);
        loader.loadBytes(FileReference(e.target).data);
    }


    private function onDataLoadComplete(e:Event):void {
        var bitmapData:BitmapData = Bitmap(e.target.content).bitmapData;

        var loader:Loader = Loader(e.target.loader);
        var file:String = filenameDict[loader];
        delete filenameDict[loader];

1 Ответ

0 голосов
/ 11 ноября 2009

Вы можете сделать это с массивами, но, как вы можете видеть из кода, Dictionary - более простой способ.

var files:Array = [];
var loaders:Array = [];
private function onFileLoadComplete(e:Event):void 
{
  var loader:Loader = new Loader();
  files.push(e.target);
  loaders.push(loader);
  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDataLoadComplete);
  loader.loadBytes(FileReference(e.target).data);
}
private function onDataLoadComplete(e:Event):void
{
  var bitmapData:BitmapData = Bitmap(e.target.content).bitmapData;
  var loader:Loader = Loader(e.target.loader);
  var index:Number = loaders.indexOf(loader);
  var file:String = FileReference(files[index]).name;
  /*
   * Clear the arrays to get rid of unwanted references that might 
   * prevent them from being garbage collected.
   * */
  files.splice(index);
  loaders.splice(index);
}

Я не обращал внимания на FileReference FP10, когда сделал первую версию этого поста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...