spring+hibernate檔案上傳並放入大欄位的處理
spring+hibernate 用來支援檔案上傳下載,特別是放入資料庫大欄位的時候,操作真的平民化了很多。
首先準備SPRING 框架,HIBERNATE 框架,common-file_upload.jar包。
首先準備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屬性就會像其他屬於一樣被處理。
這裡採用了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的呼叫方法-->
<!--使用Cos FileUpload的呼叫方法
-->
1048576
4096
<!--使用common-file_upload.jar的呼叫方法-->
<!--使用Cos FileUpload的呼叫方法
-->
所以,需要準備cos.jar或者common-file_upload.jar。
接下來在一個表單中處理multipart;
這時候我們準備一個代檔案域的表單
file.jsp:
檔案上傳
接下來在一個表單中處理multipart;
這時候我們準備一個代檔案域的表單
file.jsp:
我們將上面的URL對映到控制器上,已經處理bean 的控制器本身。
org.vincent.FileUploadBean
file.jsp
然後建立控制器和含有檔案屬性的bean。
FileUploadBean.java
public class FileUploadBean {
private byte[] file;
FileUploadBean.java
public class FileUploadBean {
private byte[] file;
public byte[] getFile() {
return file;
}
return file;
}
public void setFile(byte[] file) {
this.file = 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 已經把檔案傳到記憶體當中了。
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");
}
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());
}
}
ServletRequestDataBinder binder) throws ServletException {
binder.registerCustomEditor(byte[].class,
new ByteArrayMultipartFileEditor());
}
}
如果只是存放在伺服器硬碟上,那麼到這一步算是結束了。但是如果你要放在BLOB大欄位中,,繼續往下走。
(這裡就不討論一些基本的HIBERNTAE配置和SPRING 配置。如有不明白去看這兩個的文件)
(這裡就不討論一些基本的HIBERNTAE配置和SPRING 配置。如有不明白去看這兩個的文件)
建立一個uploadfile表對映。
表結構如下
uuid varchar2 32
file blob
表結構如下
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;
}
}
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的配置如程式碼
我們前面已經指出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的配置如程式碼
<!--
這裡我採用了c3p0為連線池。如果是其他的還可以選擇。
如果是用dataSource則使用。
或則還有其他的連線池,等等。
-->
這樣配置好以後,就能在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;
}
// 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@]
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7558084/viewspace-1003488/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- .NET Core 如何上傳檔案及處理大檔案上傳
- php上傳大檔案失敗處理PHP
- laravel處理檔案上傳Laravel
- java讀取大檔案並處理Java
- 處理檔案上傳的工具包 - fuh
- JAX-WS - 二進位制處理之MTOM(檔案上傳)
- nodejs檔案上傳處理模組formidableNodeJSORM
- 前端大檔案上傳/分片上傳前端
- [C#]使用WebClient上傳檔案並同時Post表單資料欄位到服務端C#Webclient服務端
- 上傳檔案並目錄打散
- git上傳檔案時報錯常見的處理辦法Git
- Oracke大欄位Blob匯出到檔案
- Asp.Net 上傳大檔案專題(1)--概述:上傳大檔案的難點ASP.NET
- .Net上傳檔案處理三大正規化,及開發注意事項
- ajax上傳檔案,spring mvc獲取檔案並處理,通過頁面按鈕傳送url,由後臺控制檔案下載SpringMVC
- 處理檔案上傳時的訊息格式轉換問題
- uploadify前臺上傳檔案,java後臺處理的例子Java
- Java如何上傳大檔案Java
- exp,imp 不同表空間大欄位處理方法
- JDBC處理包含CLOB欄位JDBC
- BLOB及CLOB欄位處理
- MybatisPlus經典示例:使用Wrapper查詢指定欄位並新增欄位函式處理MyBatisAPP函式
- Python處理大檔案Python
- 使用Java處理大檔案Java
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- iis 下 swfupload 上傳大檔案 卡頓 404 錯誤 等問題處理方法
- Git處理二進位制檔案Git
- avro處理hadoop上的小檔案VRHadoop
- php檔案上傳之多檔案上傳PHP
- post 表單大檔案上傳
- linux大檔案上傳(nc)Linux
- 大檔案上傳實踐分享
- Simple WPF: S3實現MINIO大檔案上傳並顯示上傳進度S3
- PL/SQL 插入clob欄位處理SQL
- php如何上傳txt檔案,並且讀取txt檔案PHP
- 大規格檔案的上傳優化優化
- ASP.NET:MVC中檔案上傳與地址變化處理ASP.NETMVC
- Python 如何處理大檔案Python