之前存入数据库中的图片都是图片的链接,今天直接向数据库中存入图片,遇到很多问题:查阅了很多资料,看过的一篇资料是这样映射文,这样处理图片字段:
private byte[] image;
<property name="image" type="oracle.sql.BLOB">
<column name="IMAGE" />
</property>
或者是 type="java.sql.Blob"
结果都报错:错误ClassCastExcetion 类型转换错误,说java.sql.Blob 不能转换成oracle.sql.BLOB之类的。
错误很久没有解决,后来得知这个方法行不通,误解了我很久。
下面把正确的操作写出来,希望大家不要犯同样的错误:
javabean文件:
Shotimage.java:
public class Shotimage implements java.io.Serializable {
private Long id;
private String name;
private byte[] image;
private Date createtime;
//省略构造方法和set get 方法...
}
数据库映射文件:Shotimage.hbm.xml
<hibernate-mapping>
<class name="com.chart.domain.Shotimage" table="SHOTIMAGE" schema="AN_USER">
<id name="id" type="java.lang.Long">
<column name="ID" precision="20" scale="0" />
<generator class="sequence" >
<param name="sequence">image_seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="50" />
</property>
<property name="image" type="binary"> <!--注意,这里是binary类型-->
<column name="IMAGE" />
</property>
<property name="createtime" type="java.util.Date">
<column name="CREATETIME" length="7" />
</property>
</class>
</hibernate-mapping>
上传的jsp页面:upload.jsp页面
<s:form action="shotimage_add" method="post" enctype="multipart/form-data">
请输入图片的名称:<s:textfield name="name" /><br/>
请选择要上传的图片:<s:file name="image" /><br/>
<s:submit>确定</s:submit>
</s:form>
action方法:ShotimageManagerAction.java
public class ShotimageManagerAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private ShotimageService service = new ShotimageServiceImpl();
private String name;
private File image;
private Long id; //具体要显示的图片ID
private InputStream inputStream; //定义输入流,用于显示图片
public String addUI()
{
return "addUI";
}
//省略set,get方法
/**
* 添加一张图片
* @return
*/
public String add()
{
Shotimage image = new Shotimage();
image.setCreatetime(new Date());
image.setName(this.name);
if(image!=null){
try {
FileInputStream in=new FileInputStream(this.image);
byte[] buffer = new byte[in.available()];
in.read(buffer);
image.setImage(buffer);
} catch (Exception e) {
e.printStackTrace();
}
}
service.addImage(image);
return "add";
}
@SuppressWarnings("unchecked")
/**
* 图片列表
*/
public String list()
{
List<Shotimage> lists = service.findAllImages(Shotimage.class);
ActionContext.getContext().put("lists", lists);
return "list";
}
/**
* 显示一张图片
* @return
*/
public String show()
{
Shotimage image = (Shotimage)service.findImageById(this.id);
//实例化字节数组流,存储表中的照片字节
inputStream = new ByteArrayInputStream(image.getImage());
return "show";
}
}
显示列表页面: list.jsp页面
图片的显示,要重新到action中取获取
<s:iterator value="#lists" >
<tr>
<!--核心代码,省略css样式-->
<s:property value="id"/>
<s:property value="name"/>
<img src="shotimage_show.action?id=<s:property value="id"/>" width="120px" height="80"/>
<s:date name="createtime" format="yyyy-MM-dd HH-mm:ss"/>
<div align="center" class="STYLE21">删除 | 查看</div>
</s:iterator>
特别要注意:struts.xml中的配置:
<action name="shotimage_*" class="com.chart.action.ShotimageManagerAction" method="{1}">
<result name="addUI">/WEB-INF/upload/upload.jsp</result>
<result name="add" type="redirectAction">shotimage_list</result>
<result name="list">/WEB-INF/upload/list.jsp</result>
<!-- 显示图片 -->
<result name="show" type="stream"></result>
</action>
最终的图片显示: