2009-09-20 66 views
2

我有一個Flex3應用程序,必須能夠上傳多個文件,並使用標籤而不是進度條監控每個文件的單個進度。Flex 3多重上傳進度監控

我的問題是,上傳的通用進度處理程序沒有辦法(我知道)指示上傳它是否正在進行。我知道一個文件名可以檢查,但在這個應用程序的情況下,文件名可能是相同的多個上傳。

我的問題:使用通用進度處理程序如何區分具有相同文件名的2次多次上傳?

編輯:回答者可能會認爲我是Flex的總新手......因爲我是。

回答

0

我結束了創建我自己的類管理事件每個上傳文件

1

如果您正在偵聽ProgressEvents,則這些事件具有currentTarget屬性,該屬性可能會引用已註冊事件偵聽器的對象。

我假設你知道哪個文件上傳對象首先與每個對象一起使用。

編輯:實施例使用的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

我認爲這已註冊的進度事件的對象是文件的參考?好吧,說我有2個對象 - FileReference和我可以用來跟蹤文件的對象。如何將progressEvent附加到跟蹤對象,以便在文件引用的上載時觸發它?或者我想這是錯誤的方式? – 2009-09-20 21:15:55

+0

我會編輯我的答案,舉一個例子 – Cameron 2009-09-21 23:24:34

1

我使用此:

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); 
    } 

其中 「調度員」 是文件:

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

和樣品處理程序:

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

我不確定你想如何區分具有相同名稱的兩個文件。在我的情況下,我發送隊列中的文件。因此,一次只能上傳1個文件。 (pendingFiles)。

+0

感謝Glen,我使用自定義寫入隊列,但是我確實需要能夠一次上傳2+文件,所以問題仍然存在 - 我當前的實現非常相似 – 2009-09-20 23:32:48

+0

無論如何,你需要一些方法來識別它們,所以你甚至可以使用一個數組。然後,當你得到一個fileReference時,你可以說「fileArray.indexOf(fileRef)」來找到它的索引。這將是獨一無二的。或者如果你有文件的鍵,你可以使用一個對象。 – Glenn 2009-09-20 23:48:12