最近做了一个小工具给朋友用,需要将图片保存到数据库中,由于朋友只是在单机使用,也就是服务器/客户端是同一台机器,所以就忽略文件上传部分,如果用在传统B/S架构中,需要添加文件上传功能,否则会出错,好了,下面总结一下具体步骤:
一、向数据库中保存图片
在JSP页面中添加文件选择控件:
照片:
<html:file property="picture" οnchange="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();
}
就是这么简单的两居代码即可读取图片了。