2011-03-08 92 views
1

我試圖堅持使用JPA提供了上傳文件到數據庫中。最「自然」的方式(對我來說)是將域對象定義爲:堅持CommonsMultipartFile數據庫

@Entity 
class UploadFile { 
    ... 
    public CommonsMultipartFile getFileData() 
    { 
    return fileData; 
    } 
} 

但是由於沒有這樣的數據庫映射類型,所以這不起作用。在網上搜索,我發現,人們似乎適應兩種方法之一:

  • 定義字段爲java.sql.blob;
  • 定義字段作爲byte[]

@Controller類,傳入HttpServletRequest變轉換爲MultipartHttpServletRequest以訪問MultipartFile並將其轉換回byte[]流。然而,在這個方案中,我有「隨機」的結果令我感到困惑:我時不時地遇到「bean屬性不可讀」的錯誤,在byte []字段上返回類型的getter方法可能不匹配。我加倍和三重檢查了我的Bean定義,並且找不到任何錯誤。

我想我的問題是兩個摺疊:(1)任何想法,爲什麼在這種情況下會發生這個錯誤? (2)更重要的是,這種處理上傳文件的「推薦」方式是什麼?

感謝

奧利弗

回答

2

你是正確的,無論是java.sql.blobbyte[]將存儲上傳的文件在數據庫中最合適的方式。

您不應將MultipartFileCommonsMultipartFile存儲在數據庫中,因爲它們旨在用作臨時對象。請注意:MultipartFile javadoc:

文件內容存儲在內存中或臨時存儲在磁盤上。 在任一情況下,用戶是負責複製文件內容到 會話級或持久存儲作爲和如果需要的話。臨時存儲器 將在請求處理結束時清零。

我不太明白你與你的HttpServletRequest做什麼,但它聽起來不像用於處理上載的最簡單方法。處理上傳的最簡單方法是使MultipartFile參數上您的控制器方法(如果你使用Spring 3.0或更高版本,我認爲):

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public void exampleFileUpload(@RequestParam("file") MultipartFile file) { 
    if (!file.isEmpty()) { 
     try { 
      byte[] fileBytes = file.getBytes(); 

      // Persist those bytes using JPA here 

     } catch (IOException e) { 
      // Exception handling here 
     } 
    } 
} 

這應該可靠地工作,因爲你已經提取字節添加到byte[]陣列中,然後再刪除用於處理上載的任何臨時文件。

+0

感謝您的回覆。一個簡單的問題:假設我在JSP中使用''來顯示上傳表單,並使用'modelAttribute'將表單對象綁定到'UpLoadFile','path'字段被設置爲'fileData'。所以它應該是'@RequestParam('fileData')'?這會導致類型不匹配問題? – Oliver 2011-03-08 12:24:36

+0

我剛查過,確實導致類型不匹配問題。 – Oliver 2011-03-08 17:26:41

+0

如果你使用一個帶有文件上傳的模型屬性,那麼你可以(應該,我認爲)將'MultipartFile'放在你的表單(模型)對象中,而不是將它用作方法參數。所以你的控制器方法是'exampleFileUpload(@ModelAttribute('fileData')UpLoadFile model)',你的'UpLoadFile'表單對象將包含'MultipartFile文件'屬性,並且你可以通過表單對象來訪問文件,也就是'model 。.getFile()的getBytes();'。 – gutch 2011-03-08 22:36:22