我是PrimeFaces组件的新手。我有一个FileUpload(上传了多个文件),我想知道是否有办法知道在上传之前上传组件中有多少文件。 我需要的是上传1到6个文件,并在上传第6个文件后处理所有文件。 关于如何实现这一点的任何想法都是非常受欢迎的。
干杯
更新
已经尝试使用oncomplete
但它对我没有帮助'因为每次上传文件时都会执行此事件,直到所有文件都被删除。
答案 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();
}
}
}