2013-01-18 20 views
0

我有一个简单的上传监听器在一个视图范围的bean中,对于上传的每个文件,将它添加到列表中并显示列表。
问题是,当我按上传按钮一次上传多个文件时,只有一个文件被添加到列表中,并且没有显示异常。另一方面,如果我上传单个文件,等待上一个完成,则行为是正常的。
我想到了一些并发问题,但后来,当我试图把bean放在会话范围内时,它正常工作。并发问题是否有可能使视图无效?
还有其他建议吗?非常感谢Primefaces上传与视图范围的bean,并发问题?

<h:form id="form" enctype="multipart/form-data"> 

    <p:wizard widgetVar="wiz" render="true" id="wizard"> 

     <p:tab id="p0" title="file upload" step="0"> 
      <p:panel> 
       <p:fileUpload 
        fileUploadListener="#{myBean.uploadedFile}" 
        mode="advanced" multiple="true" sizeLimit="100000" 
        update="fileList"/> 

       <p:dataList id="fileList" value="#{myBean.filesName}" var="file">#{file}</p:dataList> 

豆子:

public void uploadedFile(FileUploadEvent event) { 

    try { 
     files.add(event.getFile()); 

     filesName.add(event.getFile().getFileName()); 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 

} 
+0

如果添加process =“@ this”并删除enctype,该怎么办? – Darka

+0

@Darka'enctype =“multipart/form-data”'是通过Web表单提交文件上传时必需的(这是一种HTML通用的Web开发概念)。 –

+0

我想你应该使用'@ SessionScoped'托管bean来让你的例子工作。 –

回答

2

我刚刚一直停留在像你一样的情况。经过艰苦的调试,我终于找到了一个可以帮助您的解决方案。

我觉得这个问题来自ViewScoped范围,在管理会话上下文中。所以我尝试自己管理会话上下文。使用此代码初始化会话和您的列表:

FacesContext context = FacesContext.getCurrentInstance(); 
    HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
    session.setAttribute("files", new ArrayList<UploadedFile>()); 

您必须初始化列表,它是强制性的。 然后在您的handleFileUpload方法中,只需使用保存在会话上下文中的属性“files”来保存上传文件。现在你的方法可以处理MULTIPLE上传文件。

+0

非常感谢,我会尽力的! –

+0

当存储到会话中时,您将在所有视图之间共享它,除非使用会话序列化,否则它将使用JVM内存。 –

+0

什么是更好的是临时表或文件存储保持上传的文件,并与定期清理过程与视图关联。 –