Хорошо, это довольно старая тема, но я нашел простой способ определить количество загруженных файлов.
p:fileUpload
Виджет имеет массив с мета-информацией о выбранных файлах.Передав длину этого массива вашему бину, вы получите общее количество файлов.
Однако существует проблема: p:fileUpload
не передает окружающие формы, поэтому мне пришлось поместить невидимую кнопку вдольс h:inputHidden
для передачи количества файлов из 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
}
}