2013-01-18 22 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

什麼是更好的是臨時表或文件存儲保持上傳的文件,並與定期清理過程與視圖關聯。 –