采用流的方式将图片转化成二进制流存到blob中,显现时再用流的方式取出来

解决方案 »

  1.   

    如何用jsp输出存在于oracle数据库Blob字段中的jpg图片
    在web-oa系统中,档案管理好象不可或缺。其中员工照片常常做成这样:用户通过浏览器上传员工相片,服务端程序接收图片文件,保存到数据库中的某个表的Blob字段里(关于文件上传和blob字段的更新,请参考http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=11003和http://forum.hibernate.org.cn/viewtopic.php?t=254)。通过(jdbc/jdo)和(jsp/servlet),服务器再把保存在Blob字段中的图片文件展现给用户。我这里给出一个关于展现的简单例子。1.在数据库中建表,并且表要包含Blob字段。
    2.用plsql developer这种客户端数据库工具,修改某条记录的Blob字段,存入一个jpg文件。
    3.用jdbc或者hibernate获取某条记录的Blob字段数据。(请参考参考资料2)
    4.写一个jsp文件,来输出图片。如下所示//////////////////////cwry_pic.jsp/////////////////////////
    <%@page import="java.io.*"%>
    <%@page import="com.jagie.business.profile.*" %>
    <%@page import="java.sql.Blob"%>
    <%
    response.reset();
    //这个设置很重要,否则客户端浏览器不能识别输出内容,导致弹出下载的对话框。
    response.setContentType("image/jpeg");
    ServletOutputStream sos = response.getOutputStream();
    //这里是用hibernate来根据id装载对象,你可以用别的方式如jdbc来组装对象,附文中有
    //BaseInfo这个javabean的示意性代码.
    BaseInfo bif= ProFileOperator.loadProFile(Long.valueOf("1"));
    //输出图片
    if(bif!=null&&bif.getPic()!=null){
    Blob blob=(Blob)bif.getPic();
    InputStream pi = blob.getBinaryStream();
    int blobsize = (int)blob.length();
    byte[] blobbytes = new byte[blobsize];
    int bytesRead = 0;
    while ((bytesRead = pi.read(blobbytes)) != -1) {
    sos.write(blobbytes, 0, bytesRead);
    }
    pi.close();
    sos.flush();
    }
    %>发布这个jsp到你的web服务器,再用浏览器访问这个jsp页面,你就可以看到保存在Blob字段中的图片了。
    附文:///////////////////BaseInfo.java示意性代码///////////////////////
    package com.jagie.business.profile;
    public class BaseInfo{
    //pk
    private Long id;
    //相片
    private java.sql.Blob pic;
    public Long getId() {
    return id;
    }
    public void setId(Long id) {
    this.id = id;
    } public java.sql.Blob getPic() {
    return pic;
    }
    public void setPic(java.sql.Blob pic) {
    this.pic = pic;
    }
    }