FileUpload 中的 PrimeFaces 文件数

BRa*_*t27 5 upload jsf primefaces

我对 PrimeFaces 组件很陌生。我有一个 FileUpload(上传了多个文件),我想知道是否有办法在上传之前知道上传组件中有多少文件。我需要的是上传 1 到 6 个文件,并在第 6 个文件上传后处理所有文件。关于如何实现这一目标的任何想法都非常受欢迎。

干杯

更新 已经尝试过,oncomplete但它对我没有帮助,因为每次上传文件时都会执行此事件,而不是直到所有文件都上传。

Ale*_*hin 5

好吧,这是相当老的线程,但我找到了确定上传文件数量的直接方法。

p:fileUpload小部件有一个数组,其中包含有关所选文件的元信息。通过将此数组的长度传递给您的 bean,您将获得文件的总数。

但有一个问题: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>
Run Code Online (Sandbox Code Playgroud)

我还必须使用它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   
    }
}
Run Code Online (Sandbox Code Playgroud)


spa*_*uny 1

如果您想上传所有文件,一次全部 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我不同意这一点...为了简单起见,用户上传了 X 个文件,我想在第 X 个文件完全上传后运行一个进程。我不在乎用户现在上传 1 个文件,两小时后上传 5 个文件。就是这样。 (2认同)