PrimeFaces FileUpload中的文件数

时间:2011-12-20 22:41:39

标签: jsf upload primefaces

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

干杯

更新 已经尝试使用oncomplete但它对我没有帮助'因为每次上传文件时都会执行此事件,直到所有文件都被删除。

3 个答案:

答案 0 :(得分:3)

好的,这是一个非常古老的主题,但我已经找到了确定上传文件数量的明确方法。

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>

我还必须使用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 :(得分: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();
  }
}

答案 2 :(得分:0)

我已经修改了Aleksandr的答案,以简化onstart命令,但要花更多复杂的Java零件。

</div>
  <p:fileUpload widgetVar="importFile" listener="#{fileUploadView.handleFileUpload}" dragDropSupport="true" mode="advanced" multiple="true"
                        onstart="rc([{name:'size', value:PF('importFile').files.length}])"/>
  <p:remoteCommand name="rc" update="messages" actionListener="#{fileUploadView.setSize}" />
</div>

@Named
@ViewScoped
public class FileUploadView {

  private AtomicInteger size = new AtomicInteger();

  private List<UploadedFile> files = new ArrayList<>();

  public void setSize(ActionEvent e) {
    String length  = e.getFacesContext().getExternalContext().getRequestParameterMap().get("size");
    if(length != null) {
      size.set(Integer.parseInt(length));
    }
  }
  public void handleFileUpload(FileUploadEvent event) {
    files.add(event.getFile());
    if(size.decrementAndGet() == 0) {
      FacesMessage msg = new FacesMessage("Successful", files.size() + " uploaded");
      FacesContext.getCurrentInstance().addMessage(null, msg);
      files.clear();
    }
  }
}