有时候,我们在保存用户头像的时候,想直接将图像信息保存到数据库当中,这时就要用到blob了。我就来说一下 spring4 hibernate4 struts2环境下的操作吧。
hibernate的bean是这么操作,
private Blob head_photo; // 省略get/set方法。
User.hbm.xml 映射文件里面这样写:
<property name="head_photo" type="blob">
<column name="head_photo" ></column>
</property>
在hibernate3中可能会有些区别,这里主要讲hibernate4.
然后在struts当中,配置form表单为:
<s:form action="user_%{id==null?'add':'edit'}" method="post" enctype="multipart/form-data">
<s:file value="上传" name="file"></s:file>
<br />
头像: 这个图像是做为回显,需再定义一个 user_toStream的action
</s:form>
然后在action里面用一个定义一个File file属性
private File file; //get、set方法省略
public String add() throws Exception {
// 得到LobHelper
Session session=sessionFactory.openSession(); //用 getCurrentSession()的时候,取不到session,所以用openSession,也要注意关闭
LobHelper lobHelper = session.getLobHelper();
System.out.println("lobHelper:"+lobHelper);
byte[] fileArray = org.springframework.util.FileCopyUtils.copyToByteArray(file);
Blob blob=lobHelper.createBlob(fileArray); //hibernate4是用这一种方式来获取blob
model.setHead_photo(blob); // model是采用模型驱动 ModelDriver<T>
session.close();
if (StrUtils.notNull(model.getPassword())) {
model.setPassword(DigestUtils.md5Hex(model.getPassword())); //md5加密
} else {
model.setPassword(DigestUtils.md5Hex("123456"));
}
if (0 == model.getUserType()) { // 0为求美者
UserBeauty ub = new UserBeauty();
BeanUtils.copyNotNullProperties(model, ub);
ub.setAlipay(getRequest().getParameter("alipay"));
String userId = (String) userBeautyService.save(ub);
log.info("保存的用户,userId:" + userId);
} else if (1 == model.getUserType()) { // 为医务人员
UserDoctor doctor = new UserDoctor();
BeanUtils.copyNotNullProperties(model, doctor);
doctor.setTitle(getRequest().getParameter("title"));
String userId = (String) userDoctorService.save(doctor);
log.info("保存的用户,userId:" + userId);
}
return "toList";
}
最后上一个图像回显的action
public void toStream() {
User user = userService.getById(request.getParameter("id"));
log.info("user"+user);
ServletOutputStream sout; //直接用这一个输出了
try {
sout = ServletActionContext.getResponse().getOutputStream();
InputStream in = user.getHead_photo().getBinaryStream(); //取出-->流
int i = 0;
byte[] b=new byte[1024];
while((i=in.read(b))!=-1){
sout.write(b);
}
sout.flush();
sout.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
另外在使用的过程当中,发现如果给bean开启二级缓存的话,是会报错的,大概是说Blob不能进行缓存。如果有更好的思路,欢迎留言!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于