2013-03-10 96 views
0

我有一個允許用戶下載文件的Maven/Spring/Java應用程序。這是我的應用程序的目錄結構。Java Maven應用程序下載在本地但不在服務器上工作

src 
    main 
    java 
     com 
     mycompany 
      controller 
      MyDownloadController 
    resources 
     downloads 
     MyDocument.docx 

這裏是下載文件的控制器代碼。

File file = new File("src/main/resources/downloads/MyDocument.docx"); 

response.setContentType("application/docx"); 
response.setContentLength((int) file.length()); 
response.setHeader("Content-Disposition", "attachment; filename=\"MyDocument.docx\""); 

DataInputStream inputStream = new DataInputStream(new FileInputStream(file)); 
ServletOutputStream outputStream = response.getOutputStream(); 

int length = 0; 
byte[] byteBuffer = new byte[4096]; 
while ((inputStream != null) && ((length = inputStream.read(byteBuffer)) != -1)) { 
    outputStream.write(byteBuffer, 0, length); 
} 

inputStream.close(); 
outputStream.close(); 

一切工作正常在本地Tomcat服務器上。但是當我嘗試上傳到服務器(Jelastic)時,我得到了一個500錯誤java.io.FileNotFoundException: src/main/resources/downloads/MyDocument.docx (No such file or directory)

我查看了服務器上的Tomcat目錄,文檔在那裏(沒有截取公司隱私的實際文檔)。

structure

我猜這事做使用類路徑或東西。但我不知道我需要更新什麼或如何更新。

回答

1

由於您的文件是在資源目錄中,你需要將它稱爲一個類路徑資源。類路徑上的資源可以存在於目錄結構中,或存儲在jar或war等存檔中。在你的情況下,你的本地環境在文件系統上有這些文件,但是當它們被部署時,它們最終會發生戰爭。

訪問類路徑資源時,FileInputStream不是一個好選擇。

訪問這些文件的正確方法是使用類加載器。您可以調用getResourceAsStream並將該位置提供給資源。在你的情況下,它看起來像這樣:

InputStream is = getClass().getClassLoader() 
    .getResourceAsStream("/downloads/MyDocument.docx") 

這將使用用於加載當前類的類加載器。

+0

感謝您的幫助。 :) – 2013-03-10 23:12:40

0

這應該工作:

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("MyDocument.docx"); 
+0

這結束爲空。 – 2013-03-10 22:38:46

相關問題