struts2+Hibernate 读取oracle blob 字段中的图片

本文介绍了在使用Struts2和Hibernate框架时,如何正确处理Oracle数据库中的BLOB类型字段,特别是存储和读取图片数据时遇到的问题及解决方案。文章详细阐述了错误的映射方式,如将BLOB类型错误地映射为`oracle.sql.BLOB`或`java.sql.Blob`,导致类型转换异常。并提供了正确的操作步骤,包括javabean、映射文件、上传页面、action方法和列表页面的配置,强调了在Struts.xml配置中的重要细节,以确保图片能够成功显示。
摘要由CSDN通过智能技术生成

之前存入数据库中的图片都是图片的链接,今天直接向数据库中存入图片,遇到很多问题:查阅了很多资料,看过的一篇资料是这样映射文,这样处理图片字段:

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>

最终的图片显示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值