不可否认的,自己的确还是个新人,操作oracle clob字段也搞上了两天才搞定,网上看了很多贴,都没能解决,最后发现了一个比较简单的方法。
要解决的问题:用户通过页面提交上传的图片,图片需转化成base64编码,数据库用clob字段存储该图片。
解决方法:
网上看的帖子都说操作oracle clob字段必须在一个单独的事务中处理,(到底为什么,偶也不清楚)整合三大框架的项目,可在DAO组件中继承HibernateDaoSupport,然后开启一个单独的事务进行操作。
DAO层源码:
/**
* 保存
* @param img result
* return
*/
public int addimg(Imginfo img,String result) throws Exception {
Session session=this.getHibernateTemplate().getSessionFactory().openSession();
Transaction tran = session.beginTransaction();
//先插入一个空值
img.setImg(Hibernate.createClob("1"));
session.save(img);
session.flush();
session.refresh(img,LockMode.UPGRADE);
SerializableClob sc = (SerializableClob)img.getImg();
int imgid=img.getId();
Clob wrapclob = sc.getWrappedClob();
CLOB clob = (CLOB)wrapclob;
clob.putString(1,result);
tran.commit();
return imgid;
}
参数img是封装好的实体类。result是图片转换成base64位码的结果。操作oracle clob字段要先插入一个空值,网上许多贴都直接Hibernate.createClob(""));插入一个空值,但我在上面代码中img.getImg()时会报空指针错误,但img.setImg(Hibernate.createClob("1"));却不会,到底为什么?还搞不懂,但问题总算解决了,有机会再问问前辈们。
将图片转换成base64位的方法:
/**
* 对数组byte进行编码
* @param
* @return
*/
public static String setBase64(byte[] by){
return new BASE64Encoder().encode(by);
}
/**
* 对数组byte进行解码码
* @param
* @return
*/
public static byte[] getBase64(String by){
byte bytes[] = null;
try {
bytes=new BASE64Decoder().decodeBuffer(by.trim());
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
action的代码
只贴部分
UploadForm f = (UploadForm) form;
//获取jsp页面上传的图片
FormFile formFile = f.getFile();
//将formFile转换成byte[]数组
byte[] b=formFile.getFileData();
JSP页面代码:
<td width="10%">
<input type="file" name="file">
</td>
</tr>