spring+hibernate檔案上傳並放入大欄位的處理

tonyscau發表於2008-05-06
spring+hibernate 用來支援檔案上傳下載,特別是放入資料庫大欄位的時候,操作真的平民化了很多。
首先準備SPRING 框架,HIBERNATE 框架,common-file_upload.jar包。
當然了不能忘記資料庫JDBC驅動的jar。這裡是oracle 就用了class12.jar
這裡採用了Oracle 資料庫,在webroot下建立一個fileupload目錄。以便放上傳來的檔案。
等等。。
既然用了Srping 框架,那就要翻翻Srping 手冊,他對檔案上傳的支援。Spring 由內建的multipart包中的外掛物件
MultipartResovler 來完成的。Spring 提供MultipartResovler可以支援Commons FileUpload()
和Cos FileUpload()所以剛開始還要準備一個common-file_upload.jar。
預設,Spring 是沒有multipart 處理。所以要用multipart處理需要在web應用的上下文加上multipart 解析器。然後你的請求中包含multipart,在上下文
定義的MultipartResolver就會解析他,這樣,你請求中的multipart屬性就會像其他屬於一樣被處理。
請看下面:
<!--使用common-file_upload.jar的呼叫方法--&gt

<!--使用Cos FileUpload的呼叫方法

--&gt

1048576


4096
所以,需要準備cos.jar或者common-file_upload.jar。
接下來在一個表單中處理multipart;
這時候我們準備一個代檔案域的表單
file.jsp:


檔案上傳


檔案上傳:


檔案註釋:







我們將上面的URL對映到控制器上,已經處理bean 的控制器本身。

org.vincent.FileUploadBean
file.jsp
然後建立控制器和含有檔案屬性的bean。
FileUploadBean.java
public class FileUploadBean {
private byte[] file;
public byte[] getFile() {
return file;
}
public void setFile(byte[] file) {
this.file = file;
}
}
UploadFileCtrl.java
public class UploadFileCtrl extends SimpleFormController {
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object arg2, BindException arg3)
throws Exception {
// TODO Auto-generated method stub
FileUploadBean bean = (FileUploadBean) arg2;
byte[] bytes = bean.getFile();//到這步的時候Spring 已經把檔案傳到記憶體當中了。
// cast to multipart file so we can get additional information
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
.getFile("file");
//判斷是否有檔案被上傳,如果有,就把檔案放入資料庫或者是伺服器上的硬碟裡。
if (bytes.length!=0) {
String path = request.getRealPath("/fileupload/");
File dirPath = new File(path);
if (!dirPath.exists()) {
dirPath.mkdirs();
}
/*
這是存放到BLOB大欄位當中。
UpLoadPicPO po = new UpLoadPicPO();
po.setFile(bytes); //在這裡就感覺輸入大欄位就特別簡單了。
po.save();
*/
//以下是存放入伺服器硬碟上。
String filename=path+file.getName();
File uploadedFile = new File(filename);
FileCopyUtils.copy(bytes, uploadedFile);
System.out.println("********************************");
System.out.println(uploadedFile.getAbsolutePath());
System.out.println(bytes.length);
System.out.println("********************************");
}
return new ModelAndView("file.jsp");
}
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws ServletException {
binder.registerCustomEditor(byte[].class,
new ByteArrayMultipartFileEditor());
}
}
如果只是存放在伺服器硬碟上,那麼到這一步算是結束了。但是如果你要放在BLOB大欄位中,,繼續往下走。
(這裡就不討論一些基本的HIBERNTAE配置和SPRING 配置。如有不明白去看這兩個的文件)
建立一個uploadfile表對映。
表結構如下
uuid varchar2 32
file blob
uploadfile.hbm.xml:








PO檔案如下:
UploadFilePO:
public class UpLoadPicPO extends AbstractPO{

private String id;
private byte[] file;
public byte[] getFile() {
return image;
}
public void setFile(byte[] file) {
this.file = file;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Lob欄位處理的配置:
我們前面已經指出Oracle的Lob欄位和一般型別的欄位在操作上有一個明顯的區別--那就是你必須首先透過Oracle的empty_blob()/empty_clob()初始化Lob欄位,
然後獲取該欄位的引用,透過這個引用更改其值。所以要完成對Lob欄位的操作,Hibernate必須執行兩步資料庫訪問操作,先Insert再Update。
使用BlobByteArrayType欄位型別後,為什麼我們就可以象一般的欄位型別一樣操作Blob欄位呢?可以確定的一點是:BlobByteArrayType不可能逾越Blob天生的操作方式,
原來是BlobByteArrayType資料型別本身具體資料訪問的功能,它透過LobHandler將兩次資料訪問的動作隱藏起來,使Blob欄位的操作在表現上和其他一般欄位業型別無異,
所以LobHandler即是那個"苦了我一個,幸福十億人"的那位幕後英雄。
LobHandler必須注入到Hibernate會話工廠sessionFactory中,因為sessionFactory負責產生與資料庫互動的Session。LobHandler的配置如程式碼


/WEB-INF/classes/config/hibernate_oa.cfg.xml



<!--
這裡我採用了c3p0為連線池。如果是其他的還可以選擇。
如果是用dataSource則使用。

或則還有其他的連線池,等等。
--&gt





這樣配置好以後,就能在UploadFileCtrl.java裡就能去掉/* */,就這麼簡單。。方便吧。。哈哈哈!!!
要從大欄位裡做下載也很簡單啊。看下面程式碼。
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
response.setContentType("application/x-msdownload");

UpLoadPicPO po = (UpLoadPicPO)dao.get(UpLoadPicPO.class);//這裡我只是簡略的寫了下,意思大家都明白。
byte[] bytes = po.getFile();
ServletOutputStream sos = response.getOutputStream();
sos.write(bytes);
sos.close();
return null;
}
參考文章:
spring 手冊。
spring+hibernate+oracle9i用clob 文章出處:
使用spring MVC框架進行檔案上傳 文章出處:http://www.21tx.com/dev/2005/08/04/13046.html
Struts+Spring+Hibernate實現上傳下載 文章出處:http://www.21tx.com/dev/2005/08/04/13046.html
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7558084/viewspace-1003488/,如需轉載,請註明出處,否則將追究法律責任。

相關文章