2009-10-22 36 views
8

我正在使用Java Server Faces查找某些文件上傳。我發現它使用RichFaces this great introduction。不過,我在這裏理解這個過程有一些麻煩。使用RichFaces上傳文件

首先,用戶選擇一個文件,如果即時上傳設置爲true,使用AJAX處理的文件,到目前爲止,一切順利。當談到但是下一步,在豆端聽衆下面讓我困惑:

public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

    System.out.println(f.getAbsolutePath()); 
} 

的絕對路徑是在我的電腦上的臨時目錄,確保我明白,但你會怎麼做該文件可用於webbapplication?我的應用程序被部署爲WAR文件。可以將它上傳到WAR嗎?可能聽起來很愚蠢,但實際上它可能非常方便。

我深知,我可以重命名將其複製到新位置的文件,但是是要走的路?

回答

5

寫的東西你的戰爭目錄(假設戰爭甚至爆炸的目錄),在一般情況下,一個壞主意(出於同樣的原因,在應用程序目錄中存儲你的數據通常是一個壞主意)。

你可能希望它最終在一個持久性存儲中,通常是一個數據庫。具體如何管理取決於您 - 無論您是使用文件系統並在數據庫中存儲引用還是直接在數據庫中存儲BLOB以及是否使用JDBC或JPA或Hibernate等。

然後可以通過使用諸如<a4j:support event="onuploadcomplete" reRender="info" />之類的東西來刷新包含它們的面板來從數據庫讀取上傳的文件。

一個文件下載的servlet(如果RichFaces的沒有之一)是相當容易寫。

+0

正如我想的,謝謝你清理它。猜猜我將不得不考慮創建一個下載servlet。 – 2009-10-22 10:16:23

+0

你有沒有想過如何創建下載servlet,菲利普?我已經玩過了fileUpload組件,並且在我上傳它之後,我無法確定文件的位置。 – MattSayar 2010-06-23 15:19:01

5

不知道有多少幫助,這是(也許太晚!),但是這是我在服務器端使用的代碼,相當於你的聽衆。

public String uploadFile(UploadEvent event) { 
    UploadItem item = event.getUploadItem(); 

    String name = "unnamed_attachment"; 
    byte[] data = item.getData(); 

    try { 
     name = FilenameUtils.getName(item.getFileName()); 
     data = FileUtils.readFileToByteArray(item.getFile()); 
     logger.info("data.length = " + data.length); 
     UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant) 

     details.setBytes(data); 
     details.setResume(true); 
     // Save to database here 

    } catch (Exception e) { 
     FaceletsUtil.addSystemErrorMessage(); 
     logger.error(e, e); 
    } 
    return null; 
} 

剩下的就是你說的一個大問題「你會如何使文件提供給webbapplication?」。字節數組立即可用。如果你想重新下載文件,你可以提供它作爲一個鏈接到JSF會話/視圖bean中的方法,如:

<h:commandButton action="#{Manager.downloadFile}" value="Download report">        </h:commandButton> 

public void downloadFile() { 
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back 
    try { 
     response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean 
     response.setContentLength(uploadDetails.getBytes().length); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 
    } catch (IOException e) { 
     logger.error(e, e); 
    } 
    FacesContext.getCurrentInstance().responseComplete(); 
}