日期:2014-05-16 浏览次数:20518 次
? 最近做了一个小工具给朋友用,需要将图片保存到数据库中,由于朋友只是在单机使用,也就是服务器/客户端是同一台机器,所以就忽略文件上传部分,如果用在传统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(); }
?就是这么简单的两居代码即可读取