2012-01-08 54 views
0

我正在構建REST應用程序。我想上傳一個文件,並且想要將其保存在例如/ WEB-INF/resource/uploads中在REST應用程序中沒有HttpRequest的文件上傳上下文路徑

如何獲取此目錄的路徑?我的控制器看起來像這樣

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST) 
public String updateHouse(House house, @RequestParam("file") MultipartFile file, Model model) { 
    try { 
     String fileName = null; 
     InputStream inputStream = null; 
     OutputStream outputStream = null; 
     if (file.getSize() > 0) { 
       inputStream = file.getInputStream(); 

       fileName = "D:/" + file.getOriginalFilename(); 
       outputStream = new FileOutputStream(fileName); 

       int readBytes = 0; 
       byte[] buffer = new byte[10000]; 
       while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) { 
         outputStream.write(buffer, 0, readBytes); 
       } 
       outputStream.close(); 
       inputStream.close(); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 

    model.addAttribute("step", 3); 
    this.houseDao.update(house); 
    return "houseAdmin"; 
} 

第二個問題......什麼是上傳用戶文件的最佳位置?

回答

2

/WEB-INF是嘗試存儲文件上傳的不利位置。不能保證這是磁盤上的實際目錄,即使是這樣,應用程序服務器也可能禁止對其進行寫入訪問。

你應該在哪裏存儲文件取決於你想要對它們做什麼,以及你正在運行什麼操作系統。只需在Web應用程序本身之外選擇一個地方,是我的建議。也許創建一個專用目錄

此外,MultipartFile轉移到另一個位置的過程要簡單得多,比你讓了出來:

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST) 
public String updateHouse(House house, @RequestParam("file") MultipartFile srcFile, Model model) throws IOException { 
    File destFile = new File("/path/to/the/target/file"); 
    srcFile.transferTo(destFile); // easy! 

    model.addAttribute("step", 3); 
    this.houseDao.update(house); 
    return "houseAdmin"; 
} 
+0

很好。更短,更簡單,更好:)謝謝 – Fixus 2012-01-08 22:11:07

1

你不應該存儲在/WEB-INF/resource/uploads文件。這個目錄在你的WAR中(如果打包)或者在servlet容器內的某個地方爆炸。第一個目標是隻讀的,後者不應該用於用戶文件。

通常有存儲上傳文件時考慮了兩個地方:

  1. 一些專門的文件夾。確保用戶不能直接訪問此目錄(例如匿名FTP文件夾)。請注意,一旦您的應用程序在多臺機器上運行,您將無法訪問此文件夾。所以考慮某種形式的網絡同步或共享網絡驅動器。

  2. 數據庫。這是有爭議的,因爲二進制文件往往佔用大量的空間。但是這種方法在分發應用程序時更簡單一些。

+0

是的我知道我可以使用數據庫,但我不想。我不想上傳將顯示在頁面(主要是)圖像上的用戶文件。所以我應該創建類似/ var/www/project/user_uploads的目錄並從那裏拋出文件並上傳到那裏。 – Fixus 2012-01-08 22:12:16

+0

糾正我,如果我錯了,但不是'/ var/www /'目錄可從瀏覽器訪問?這意味着每個用戶都可以在不受您控制的情況下訪問任何文件。這可能是一個優勢(原始Apache訪問速度很快),但如果您想要應用更嚴格的安全模型,也是一個安全漏洞。 – 2012-01-08 22:16:09

+0

真的,但我可以限制只能從Apache訪問此目錄。將只有圖像文件,所以如果有人訪問它不會是一個大戲。但我同意你的匿名FTP文件夾的例子更好 – Fixus 2012-01-09 10:55:51

相關問題