2016-12-11 38 views
0

我有要求從模態對話框上傳文件。所以我設法用簡單的非Ajax模式primeFaces這樣做fileUpload組件:PrimeFaces UploadedFile afax sizelimit從模態對話框

<p:dialog id="dlg" widgetVar="dlg" modal="true" appendTo="@(body)" 
      header="#{messages['pages.dlg']}" closeOnEscape="true"> 
    <h:form id="dlgForm" enctype="multipart/form-data"> 
     <!-- Some business data --> 
     <p:fileUpload value="#{bean.uploadedFile}" mode="simple"/> 
     <p:commandButton id="saveBtn" action="#{bean.save}" update="messages" ajax="false" 
      partialSubmit="dlgForm"/> 
    </h:form> 
</p:dialog> 

當從豆調用save方法我有一個商業邏輯運行的服務方法。現在我得到新的要求:將文件大小限制爲5 MB。但是,當我試圖在fileUpload組件上使用sizeLimit屬性時 - 我什麼都沒有發生。原因是驗證是在客戶端,但禁用ajax這是不可能驗證。

我試圖採取advanced模式,但得到了幾個問題:

  1. 對bean的uploadedFilerequestScoped - 所以當save按鈕調用我不能得到的數據。我只能將其保存在fileUploadListener - 但問題來了:我需要將另一個業務數據保存爲該流程的一部分。上傳的文件是用戶提供的信息的一部分。沒有這些數據我就不能調用保存文件。
  2. 當按下upload時,文件上傳時預覽(如果是圖像文件) - 預覽將在文件上傳後立即消失。我怎麼能告訴他留在advanced模式的底部字段fileUpload組件?只有在按下按鈕save時才能保存在服務器端?

所以問題是:如何在這種對話框中使用advanced組件類型?我正在運行PrimeFaces 6.0,JSF 2.2(mojara)。

回答

0

我得到了解決方案,它非常簡單。我只需要節省bean的私有字段上傳的文件:

@ManagedBean 
@ViewScoped 
public class Bean { 
    @EJB 
    private SomeService service; 

    private BusinessObjectDTO objectDTO; // DTO with business data from dialog form 
    private byte[] fileData; 
    private String fileName; 

    public void handleFileUpload(FileUploadEvent event) { 
     UploadedFile uploadedFile = event.getFile(); 
     fileData = JSFHelper.getFileData(uploadedFile); 
     fileName = uploadedFile.getFileName(); 
    } 

    // Invoked when save is called from dialog 
    public void save() { 
     service.save(objectDTO, fileData, fileName); 
     // add info message 
    } 
} 

,然後我可以得到oncomplete與顯示另一個組件上傳的文件預覽工作。

+0

但是,這**也**是一個viewscoped豆,而不是像你在你的問題中陳述的requestcoped一個!而且我沒有看到你真的把它保存在某個地方(只有名字),除非在你的JSFHelper中存在。那麼最好在這個方法中包含內聯代碼。 – Kukeltje

+1

@Kukeltje當按下對話框中的按鈕時,保存發生在'save'方法中。 JSFHelper僅用於從'UploadedFile'實例獲取字節。 –

+0

對不起,我錯過了一小部分,我的不好。但你還**還改變了範圍,不是嗎? – Kukeltje