使用Hibernate和Struts向資料庫中儲存、讀取並顯示圖片

bolan392發表於2010-09-01

  最近做了一個小工具給朋友用,需要將圖片儲存到資料庫中,由於朋友只是在單機使用,也就是伺服器/客戶端是同一臺機器,所以就忽略檔案上傳部分,如果用在傳統B/S架構中,需要新增檔案上傳功能,否則會出錯,好了,下面總結一下具體步驟:

一、向資料庫中儲存圖片

  在JSP頁面中新增檔案選擇控制元件:

 

照片:
<html:file  property="picture" onchange="setPic()"></html:file>
<div id="pic" style="display: inline;">
     <img src="./images/defaultHead.jpg" height='95' width='70'/>
</div>

 

  這個很簡單,不必多說,div層中放的是一張預設圖片,當使用者選擇了一張圖片後則使用JS控制顯示使用者所選圖片。

  接著,在Struts的Action中處理圖片:

 

public ActionForward addWorker(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		try {
			WorkerForm workerForm = (WorkerForm)form;
			String picture = workerForm.getPicture();//獲取圖片路徑
			//封裝工人物件
			Worker worker = new Worker();
			worker.setPicture(picture);
			//如果圖片路徑不為空,則讀取圖片			
			if(null!=picture&&!"".equals(picture)){
			     InputStream image = new FileInputStream(picture);
			     worker.setImage(Hibernate.createBlob(image));
			}
			//呼叫業務邏輯,儲存單位
			workerService.addWorker(worker);
			//轉向工人列表
			return loadQueryWorker( mapping,  form,
					 request,  response);
		} catch (Exception e) {
			e.printStackTrace();
			saveErrors(request, ExceptionUtils.dealException(e));
			return mapping.findForward("global.error");
		}
	}

  

 在Worker類中,有一個java.sql.Blob型別的屬性image,用來存放圖片資訊:

 

public class Worker {
     private Blob image;
     public Blob getImage() {
          return image;
     }
     public void setImage(Blob image) {
          this.image = image;
     }
}

  

 Worker.hbm.xml對映檔案中如下配置:

 

 <property name="image" type="java.sql.Blob">
            <column name="PICTURE" length="100" />
 </property>

   

資料庫中PICTURE欄位的型別為image。

   接下來直接呼叫WorkerDAO的方法儲存物件即可:

 

public class WorkerDAO extends FoHibernateDaoSupport implements IWorkerDAO {
	public void addWorker(Worker worker) {
		this.getHibernateTemplate().save(worker);
	}
}

  

這樣,一張圖片就以二進位制形式儲存到資料庫中了

 

二、讀取並顯示圖片

  儲存成功後,下面的工作就是如何從資料庫中讀取圖片並顯示到頁面中了。

  還是從頁面開始,在頁面中想要顯示圖片的地方新增如下程式碼:

 

<img title="" alt="圖片格式錯誤" height='95' width='70' src='workerAction.do?method=showWorkerPicture&id=<bean:write name="worker" property="id"/>'/>

 這個圖片標籤的alt屬性指定如果圖片顯示錯誤的提示資訊,src屬性指向了Struts的一個Action方法,下面就來看一下這個action:

 

                /**
	 * 顯示工人照片Action
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 */
	public ActionForward showWorkerPicture(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		try {
		      WorkerForm workerForm = (WorkerForm)form;
		      String id = workerForm.getId();//得到工人編號	
		    //呼叫業務邏輯,查詢圖片
		    Blob image = workerService.queryPicture(id);
		      int length = (int)image.length();//取得流中的可用位元組總數   
		    byte[] buf=image.getBytes(1,length);//獲取Blob位元組陣列   
		    response.setContentType("image/jpeg");   
		      OutputStream toClient=response.getOutputStream();//獲取輸出流   
		    for (int i = 0; i < buf.length; i++) {   
		           toClient.write(buf[i]);//輸出到頁面   
		    }   
		        toClient.close();//關閉輸出流   
		    return null;
		} catch (Exception e) {
			e.printStackTrace();
			saveErrors(request, ExceptionUtils.dealException(e));
			return mapping.findForward("global.error");
		}
	}

 

 

  Action的方法中從資料庫中讀取了某一個Blob型別的圖片並輸出到頁面中。下面再看一下DAO如何讀取圖片:

 

public Blob queryPicture(String id) {
	Worker worker = (Worker) this.getHibernateTemplate().get(Worker.class, id);
	return worker.getImage();
}

 就是這麼簡單的兩居程式碼即可讀取圖片了。

相關文章