PrimeFaces количество файлов в FileUpload - PullRequest
4 голосов
/ 21 декабря 2011

Я очень новичок в компонентах PrimeFaces.У меня есть FileUpload (загружено несколько файлов), и я хочу узнать, есть ли способ узнать, сколько файлов содержится в компоненте загрузки до их загрузки.Что мне нужно, это загрузить от 1 до 6 файлов и сразу после загрузки 6-го процесса обработать все файлы.Любая идея о том, как этого добиться, очень приветствуется.

Приветствия

ОБНОВЛЕНИЕ Уже пробовали с oncomplete, но это не помогает мне, потому что это событие выполняетсякаждый раз, когда файл загружен не ', пока все файлы не будут.

Ответы [ 2 ]

3 голосов
/ 25 июля 2016

Хорошо, это довольно старая тема, но я нашел простой способ определить количество загруженных файлов.

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   
    }
}
1 голос
/ 21 декабря 2011

Если вы хотите загрузить все файлы, все 6 из них одновременно или только по 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...