最近在使用Oracle做文件上传,要求将文件数据保存到数据库中。Oracle提供了Blob用来存储二进制大对象数据,可是它和Java.sql里面的Blob不兼容,经常导致Blob字段无法锁定或者操作失败。由于以前没有做过这样的例子,所以花了不少时间才解决。
我使用的是struts2.1.8+spring2.5+hibernate3.2,下面是相关代码:
-
spring配置文件中配置hibernate的参数:
因为Oracle中对流的操作不支持批量,因此hibernate.jdbc.batch_size=0必须加上
-
sturts.xml中配置上传文件最大长度:
如果上传文件超出该配置范围,请求将不会发送到Acion
-
fileUpload.jsp页面设置表单属性:
enctype="multipart/form-data"该属性是Struts2对文件上传的支持,设置该属性之后就可以在Action端直接用File对象来接受上传的文件数据,而method="post"就不必多讲了,也是必须的。
-
FileAction.java中:
Action中没有任何数据处理,直接将表单数据传进服务层的文件上传方法中
-
FileServiceBean.java中:
先保存一个java.sql.Blob的空对象到数据库,然后锁定这个对象,通过转型拿到oracle.sql.BLOB对象,并对这个BLOB对象进行更新,最后提交。
大功告成。