2011-12-20 77 views
3

我對PrimeFaces組件非常陌生。我有一個FileUpload(多個文件上傳),我想知道是否有方法可以知道上傳組件上傳組件之前有多少個文件。 我需要的是上傳1到6個文件,並在第6次上傳後處理所有文件。 任何想法,我怎麼能實現這一點非常受歡迎。PrimeFaces FileUpload中的文件數

乾杯

UPDATEoncomplete已經嘗試過,但它並不能幫助我,因爲執行該事件的每一個文件上傳不是時間「,直到所有文件都。

+0

我真的不明白一件事:你希望能夠上傳各6分檔的,所以實際上上傳,然後調用的處理方法?還是隻有在所有6個文件都處於上傳狀態後才真正開始上傳? – spauny 2011-12-21 06:26:24

+0

將它們全部上傳,然後調用處理方法。 – BRabbit27 2011-12-21 14:54:19

+0

看到這個問題在2011年和現在的2015年,@ BRabbit27被問到,你可能有很多經驗。你能告訴我這件事嗎?有人知道有多少文件上傳? – 2015-09-05 08:33:23

回答

1

如果您想要一次上傳所有文件或一次只上傳1個文件,然後調用處理消息,則必須創建一個變量或更好的list,您可以在其中插入每個文件的名稱文件,甚至是文件對象,當ArrayList大小達到6時,您可以調用處理方法。就那麼簡單!

private ArrayList<UploadedFile> listWithUploadedFile = new ArrayList<UploadedFile>(); 
public void uploadMethod(){ 
//upload file, save input stream and any other thing you want 
    listWithUploadedFile.add(file); 
    if(listWithUploadedFile.size==6){ 
    myProcessUploadedFilesMethod(); 
    } 
} 
+0

那麼這樣做,但問題是如何使動態,因爲用戶有時會上傳6個文件,有時1個文件,有時3個文件...我想知道有多少文件將上傳,甚至更好的我想知道何時上傳所有文件。所以當用戶選擇3個文件時,只要第三個文件完全上傳時就設置了一個標誌 – BRabbit27 2011-12-21 15:43:40

+0

@ BRabbit27我想你完全知道用戶應該上傳的所有文件,如果你不知道你不能使用屬性' sizeLimit'因爲你永遠不知道......用戶現在可以上傳4,5,6個文件,並在一分鐘後上傳另一個文件;有兩件事你可以做:實現一個按鈕,例如'完成上傳文件',按下按鈕後,你可以調用處理方法(ajax或非ajax),或者你可以實現一個JavaScript函數(或使用RequestContext對象),如果之後的話,禁用上傳標籤(甚至隱藏它),5分鐘,沒有文件上傳 – spauny 2011-12-21 15:51:52

+0

是啊,謝謝!我想我會再放一個按鈕來表示上傳已完成。我只是想知道是否有辦法知道上傳了多少文件。是否有可能知道何時上傳所有文件?我的意思是像'oncomplete'事件,但這會觸發每個文件,是否有整個上傳事件(所有文件上傳後)? – BRabbit27 2011-12-21 16:05:26

2

好吧,這是相當古老的線程,但我發現straitforward方式來確定上傳文件的數量。

p:fileUpload小部件有一個關於選定文件的meta-info數組。通過將這個數組的長度傳遞給你的bean,你將獲得文件的總數。

有但一個問題:p:fileUpload不提交周圍的形式,所以我不得不把隱形按鈕與​​一起傳遞從JavaScript文件的數量ManagedBean:

<h:form id="importDlgForm"> 
    <p:fileUpload id="importFile" widgetVar="importFile" fileUploadListener="#{importDialogView.importFile}" 
         mode="advanced" multiple="true" 
         onstart="$('#importDlgForm\\:file_number_input').val(PF('importFile').files.length); 
         $('#importDlgForm\\:submit_btn').click();"/> 
    <h:inputHidden id="file_number_input" value="#{importDialogView.importFileNumber}"/> 
    <p:commandButton id="submit_btn" style="display: none"/> 
</h:form> 

我也必須使用AtomicInteger才能跟蹤處理的文件,因爲默認情況下p:fileUpload使用多個線程上傳文件。

private final AtomicInteger atomicImportFileNumber = new AtomicInteger(); 
private Integer importFileNumber; 

public Integer getImportFileNumber() { 
    return importFileNumber; 
} 

public void setImportFileNumber(Integer importFileNumber) { 
    this.importFileNumber = importFileNumber; 
    atomicImportFileNumber.set(importFileNumber); 
} 

public void importFile(FileUploadEvent event) { 
    // common file upload stuff 
    if (atomicImportFileNumber.decrementAndGet() == 0) { 
     // part to execute only when all files have been uploaded 
    } 
}