2009-09-20 13 views
2

J'ai une application Flex3 qui doit être capable de télécharger plusieurs fichiers et de surveiller chaque progression individuelle de fichiers en utilisant une étiquette PAS une barre de progression.Surveillance de progression de téléchargement multiple Flex 3

Mon problème est qu'un gestionnaire de progression générique pour les uploads n'a aucun moyen (que je sache) d'indiquer QU'il télécharge est en train de progresser. Je sais qu'un nom de fichier est disponible pour vérification, mais dans le cas de cette application, le nom de fichier peut être le même pour plusieurs téléchargements.

Ma question: Avec un gestionnaire de progression générique, comment différencier 2 téléchargements multiples avec le même nom de fichier?

EDIT: les répondeurs peuvent supposer que je suis un total newb à Flex ... parce que je suis.

Répondre

0

Je fini par créer ma propre classe qui gère les événements pour chaque fichier de téléchargement

1

Si vous écoutez pour ProgressEvents, ces événements ont un attribut currentTarget qui ferait référence à l'objet qui a enregistré l'écouteur d'événement.

Je suppose que vous savez quel objet de téléchargement de fichiers va avec chaque objet en premier lieu.

EDIT: Exemple d'utilisation FileReference:

import flash.net.FileReference; 
import flash.events.ProgressEvent; 
import flash.utils.Dictionary; 

public var files:Dictionary = new Dictionary();  // This will hold all the FileReference objects 

public function loadFile(id:String):void 
{ 
    var file:FileReference = new FileReference(); 

    // Listen for the progress event on this FileReference... will call the same function for every progress event 
    file.addEventListener(ProgressEvent.PROGRESS, onProgress); 

    // TODO: listen for errors and actually upload a file, etc. 

    // Add file to the dictionary (as key), with value set to an object containing the id 
    files[file] = { 'id': id }; 
} 

public function onProgress(event:ProgressEvent):void 
{ 
    // Determine which FileReference dispatched thi progress event: 
    var file:FileReference = FileReference(event.target); 

    // Get the ID of the FileReference which dispatched this function: 
    var id:String = files[file].id; 

    // Determine the current progress for this file (in percent): 
    var progress:Number = event.bytesLoaded/event.bytesTotal; 

    trace('File "' + id + '" is ' + progress + '% done uploading'); 
} 


// Load some files: 
loadFile('the first file'); 
loadFile('the second file'); 
+0

Je pensais que l'objet qui doit enregistrer l'événement progress est la référence du fichier? OK dis que j'ai 2 objets - le FileReference et l'objet que je peux utiliser pour suivre les fichiers. Comment attacher le progressEvent à l'objet de suivi de sorte qu'il se déclenche sur le téléchargement de la référence de fichier? Ou est-ce que je pense à ça dans le mauvais sens? –

+0

Je vais éditer ma réponse pour avoir un exemple – Cameron

1

J'utilise ceci:

private function _addFileListeners(dispatcher:IEventDispatcher):void { 
     dispatcher.addEventListener(Event.OPEN, this._handleFileOpen); 
     dispatcher.addEventListener(Event.SELECT, this._handleFileOpen); 
     dispatcher.addEventListener(Event.CANCEL, this._handleFileCancel); 
     dispatcher.addEventListener(ProgressEvent.PROGRESS, this._handleFileProgress); 
     dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,this._handleFileComplete); 
     dispatcher.addEventListener(IOErrorEvent.IO_ERROR, this._handleError); 
     dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, this._handleError); 
    } 

où "dispatcher" est le fichier:

 for (var i:uint = 0; i < fileList.length; i++) { 
      file = FileReference(fileList[i]); 
      this._addFileListeners(file); 
      this._pendingFiles.push(file); 
     } 

et un gestionnaire d'échantillon:

private function _handleFileOpen(e:Event):void { 
     var file:FileReference = FileReference(e.target); 
     ... 
    } 

Je ne sais pas comment vous voulez différencier deux fichiers portant le même nom. Dans mon cas, j'envoie les fichiers dans une file d'attente. Il n'y a donc qu'un seul fichier téléchargé à la fois. (pendingFiles).

+0

Merci Glen, j'utilise une file d'attente écrite personnalisée, mais je dois être en mesure de télécharger 2 fichiers à la fois afin que le problème persiste - mon implémentation actuelle est assez similaire –

+0

Vous avez besoin d'une méthode pour les identifier de toute façon, vous pouvez même utiliser un tableau. Ensuite, quand vous obtenez un fichier, vous pouvez dire "fileArray.indexOf (fileRef)" pour trouver son index. Ce sera unique. Ou si vous avez des clés pour le fichier, vous pouvez utiliser un objet. – Glenn