日期:2014-05-16  浏览次数:20502 次

使用Hibernate和Struts向数据库中保存、读取并显示图片

? 最近做了一个小工具给朋友用,需要将图片保存到数据库中,由于朋友只是在单机使用,也就是服务器/客户端是同一台机器,所以就忽略文件上传部分,如果用在传统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();
}

?就是这么简单的两居代码即可读取