Java从数据库中读取Blob对象图片并显示的方法

网友投稿 443 2023-08-04


Java从数据库中读取Blob对象图片并显示的方法

本文实例讲述了java从数据库中读取Blob对象图片并显示的方法。分享给大家供大家参考。具体实现方法如下:

第一种方法:

大致方法就是,从数据库中读出Blob的流来,写到页面中去:

复制代码 代码如下:

Connection conn = DBManager.getConnection();

  String sql = "SELECT picture FROM teacher WHERE id=1";

  PreparedStatement ps = null;

  ResultSet rs = null;

  InputStream is = null;

  OutputStream os = null;

  try {

   ps = conn.prepareStatement(sql);

   rs = ps.executeQuery();

 

   if(rs.next()){

    is = rs.getBinaryStream(1);

   }

 

   response.setContentType("text/html");

   os = response.getOutputStream();

 

   int num;

   byte buf[] = new byte[1024];

 

   while(   (num=is.read(buf))!=-1   ){

    os.write(buf, 0, num);

   }

 

  } catch (SQLException e) {

   e.printStackTrace();

  }

 

  try {

   is.close();

   os.close();

   rs.close();

   ps.close();

  } catch (SQLException e) {

   e.printStackTrace();

}

在页面中:

复制代码 代码如下:

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

"/>

搞定。

第二种方法:

整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。

复制代码 代码如下:

import java.sql.*;

import java.io.*;

 

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.awt.image.AffineTransformOp;

import java.awt.geom.AffineTransform;

 

public class OracleQueryBean {

    private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver";

    private Connection myConnection = null;

  

    private String strTabName;

  

    private String strIDName;

 

    private String strImgName;

  

    public OracleQueryBean(){

        try{

            Class.forName(oracleDriverName);

        }catch(ClassNotFoundException ex){

            System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage());

        }

    }

  

    public Connection getConnection(){

        try{

        //用户名+密码; 以下使用的Test就是Oracle里的表空间

        //从配置文件中读取数据库信息

        GetPara oGetPara = new GetPara();

        String strIP = oGetPara.getPara("serverip");

        String strPort = oGetPara.getPara("port");

        String strDBName = oGetPara.getPara("dbname");

        String strUser = oGetPara.getPara("user");

        String strPassword = oGetPara.getPara("password");

      

        this.strTabName = oGetPara.getPara("tablename");

        this.strIDName = oGetPara.getPara("imgidname");

        this.strImgName = oGetPara.getPara("imgname");

      

        String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName;

            this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword);

        }catch(Exception ex){

            System.out.println("Can not get connection:" + ex.getMessage());

            System.out.println("请检测配置文件中的数据库信息是否正确." );

        }

        return this.myConnection;

    }

}

2. 读取blob字段

 

在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:

复制代码 代码如下:

public byte[] GetImgByteById(String strID, int w, int h){

    //System.out.println("Get img data which id is " + nID);

    if(myConnection == null)

         this.getConnection();

    byte[] data = null;

    try {

            Statement stmt = myConnection.createStatement();

            ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);

          

            StringBuffer myStringBuffer = new StringBuffer();

            if (myResultSet.next()) {

                java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

                InputStream inStream = blob.getBinaryStream();

                try {

                    long nLen = blob.length();

                    int nSize = (int) nLen;

                    //System.out.println("img data size is :" + nSize);

                    data = new byte[nSize];

                    inStream.read(data);

                    inStream.close();

                } catch (IOException e) {

                    System.out.println("获取图片数据失败,原因:" + e.getMessage());

                }

              

                data = ChangeImgSize(data, w, h);

            }

            System.out.println(myStringBuffer.toString());

            myConnection.commit();

            myConnection.close();

        } catch (SQLException ex) {

            System.out.println(ex.getMessage());

        }

        return data;

}

3. 缩放图片

因为图片的大小可能不一致,但是在页面中输出的大小需要统一,所以需要

在OracleQueryBean类中增加一个函数,来进行缩放,具体代码如下:

复制代码 代码如下:

private byte[] ChangeImgSize(byte[] data, int nw, int nh){

    byte[] newdata = null;

    try{

         BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data));

            int w = bis.getWidth();

            int h = bis.getHeight();

            double sx = (double) nw / w;

            double sy = (double) nh / h;

  COxjcLzir          AffineTransform transform = new AffineTransform();

            transform.setToScale(sx, sy);

            AffineTransformOp ato = new AffineTransformOp(transform, null);

            //原始颜色

            BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);

            ato.filter(bis, bid);

          

            //转换成byte字节

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            ImageIO.write(bid, "jpeg", baos);

            newdata = baos.toByteArray();

          

    }catch(IOException e){

         e.printStackTrace();

    }

    return newdata;

}

4. 展示在页面

页面使用OracleQueryBean来根据用户提供的图片id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下:

复制代码 代码如下:

<%@ page language="java" contentType="text/html;;charset=gbk" %>

<%

    response.setContentType("image/jpeg");

    //图片在数据库中的 ID

    String strID = request.getParameter("id");

    //要缩略或放大图片的宽度

    String strWidth = request.getParameter("w");

    //要缩略或放大图片的高度

    String strHeight = request.getParameter("h");

    byte[] data = null;

    if(strID != null){

        int nWith = Integer.parseInt(strWidth);

        int nHeight = Integer.parseInt(strHeight);

        //获取图片的byte数据

        data = OrcleQuery.GetImgByteById(strID, nWith, nHeight);

        ServletOutputStream op = response.getOutputStream();      

       op.write(data, 0, data.length);

       op.close();

       op = null;

        response.flushBuffer();

        //清除输出流,防止释放时被捕获异常

        out.clear();

        out = pageContext.pushBody();

    }

%>

5. OracleQueryBean查询类的整体代码

OracleQueryBean.java文件代码如下所示:

复制代码 代码如下:

import java.sql.*;

import java.io.*;

 

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.awt.image.AffineTransformOp;

import java.awt.geom.AffineTransform;

 

public class OracleQueryBean {

    private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver";

 

    private Connection myConnection = null;

  

  

    private String strTabName;

  

    private String strIDName;

  

    private String strImgName;

  

    public OracleQueryBean(){

        try{

            Class.forName(oracleDriverName);

        }catch(ClassNotFoundException ex){

            System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage());

        }

    }

  

    public Connection getConnection(){

        try{

        //用户名+密码; 以下使用的Test就是Oracle里的表空间

        //从配置文件中读取数据库信息

        GetPara oGetPara = new GetPara();

        String strIP = oGetPara.getPara("serverip");

        String strPort = oGetPara.getPara("port");

        String strDBName = oGetPara.getPara("dbname");

        String strUser = oGetPara.getPara("user");

        String strPassword = oGetPara.getPara("password");

      

        this.strTabName = oGetPara.getPara("tablename");

        this.strIDName = oGetPara.getPara("imgidname");

        this.strImgName = oGetPara.getPara("imgname");

      

        String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName;

            this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword);

        }catch(Exception ex){

            System.out.println("Can not get connection:" + ex.getMessage());

            System.out.println("请检测配置文件中的数据库信息是否正确." );

        }

        return this.myConnection;

    }

  

    public byte[] GetImgByteById(String strID, int w, int h){

    //System.out.println("Get img data which id is " + nID);

    if(myConnection == null)

         this.getConnection();

    byte[] data = null;

    try {

            Statement stmt = myConnection.createStatement();

            ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);

          

            StringBuffer myStringBuffer = new StringBuffer();

            if (myResultSet.next()) {

                java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

                InputStream inStream = blob.getBinaryStream();

                try {

                    long nLen = blob.length();

                    int nSize = (int) nLen;

                    //System.out.println("img data size is :" + nSize);

                    data = new byte[nSize];

                    inStream.read(data);

                    inStream.close();

                } catch (IOException e) {

                    System.out.println("获取图片数据失败,原因:" + e.getMessage());

                }

              

                data = ChangeImgSize(data, w, h);

            }

            System.out.println(myStringBuffer.toString());

            myConnection.commit();

            myConnection.close();

        } catch (SQLException ex) {

            System.out.println(ex.getMessage());

        }

        return data;

    }

    public byte[] GetImgByteById(String strID){

    //System.out.println("Get img data which id is " + nID);

    if(myConnection == null)

         this.getConnection();

    byte[] data = null;

    try {

            Statement stmt = myConnection.createStatement();

            ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);

          

            StringBuffer myStringBuffer = new StringBuffer();

            if (myResultSet.next()) {

                java.sql.Blob blob = myResultSet.getBlob(this.strImgName);

                InputStream inStream = blob.getBinaryStream();

                try {

                    long nLen = blob.length();

                    int nSize = (int) nLen;

                    data = new byte[nSize];

                    inStream.read(data);

                    inStream.close();

                } catch (IOException e) {

                    System.out.println("获取图片数据失败,原因:" + e.getMessage());

                }

            }

            System.out.println(myStringBuffer.toString());

            myConnection.commit();

            myConnection.close();

        } catch (SQLException ex) {

            System.out.println(ex.getMessage());

        }

        return data;

    }

    private byte[] ChangeImgSize(byte[] data, int nw, int nh){

    byte[] newdata = null;

    try{

         BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data));

            int w = bis.getWidth();

            int h = bis.getHeight();

            double sx = (double) nw / w;

            double sy = (double) nh / h;

            AffineTransform transform = new AffineTransform();

            transform.setToScale(sx, sy);

            AffineTransformOp ato = new AffineTransformOp(transform, null);

            //原始颜色

            BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);

            ato.filter(bis, bid);         

            //转换成byte字节

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            ImageIO.write(bid, "jpeg", baos);

            newdata = baos.toByteArray();

    }catch(IOException e){

         e.printStackTrace();

    }

    return newdata;

    }

}

下面是我的存储读取blob图片的案例

复制代码 代码如下:

import java.sql.*;   

import java.io.*;  

public class InsertPhoto { 

    public static void main(String[] args) throws Exception{ 

            Class.forName("com.mysql.jdbc.Driver");   

           Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/wiseweb?user=root&password=root");   

           File f = new File("e:/123.jpg");   

           FileInputStream fis = new FileInputStream(f);   

           String sql = "insert into photo(photo,photoName) values(?,?)";   

           PreparedStatement pstmt = con.prepareStatement(sql);   

           pstmt.setBinaryStream(1,fis,(int)f.length());   

           pstmt.setString(2, "测试图片"); 

           pstmt.executeUpdate();   

           fis.close();   

           pstmt.close();   

           con.close();  

    } 

}

复制代码 代码如下:

import java.awt.image.BufferedImage; 

import java.io.BufferedInputStream; 

import java.io.IOException; 

import java.io.InputStream; 

import java.io.OutputStream; 

import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.ResultSet; 

import java.sql.SQLException; 

import java.sql.Statement; 

 

import javax.imageio.ImageIO; 

import javax.servlet.http.HttpServlet; 

import javax.servlet.http.HttpServletRequest; 

import javax.servlet.http.HttpServletResponse; 

 

import com.sun.image.codec.jpeg.JPEGCodec; 

import com.sun.image.codec.jpeg.JPEGImageEncoder; 

public class ReadPhoto extends HttpServlet{ 

 

    private static final long serialVersionUID = 1L; 

     

    public void doGet(HttpServletRequest request, HttpServletResponse response){ 

        if(request.getParameter("id") != null){ 

            response.setContentType("image/jpeg"); 

            try { 

                InputStream is = query_getPhotoImageBlob(Integer.parseInt(request.getParameter("id"))) ; 

                if(is != null){ 

                    is = new BufferedInputStream(is) ; 

                    BufferedImage bi = ImageIO.read(is) ; 

                    OutputStream os = response.getOutputStream() ; 

                    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os) ; 

                    encoder.encode(bi); 

                    os.close();   

                    is.close();   

                } 

            } catch(IOException e){ 

                e.printStackTrace(); 

            }catch (NumberFormatException e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } catch (ClassNotFoundException e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } catch (SQLException e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } 

        } 

    } 

     

    public static InputStream query_getPhotoImageBlob(int id) throws ClassNotFoundException, SQLException{   

           String sql = "select photo from photo where id="+id;   

           Connection con = null;   

           Statement stmt = null;   

           ResultSet rs = null;   

           InputStream result = null;   

           try {   

            Class.forName("com.mysql.jdbc.Driver");   

            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/wiseweb?user=root&password=root");    

            stmt = con.createStatement();   

            rs = stmt.executeQuery(sql);   

            if (rs.next())   

            result = rs.getBlob("photo").getBinaryStream();   

           } catch (SQLException e) {   

            // TODO: handle exception   

            System.err.println(e.getMessage());   

           }finally{   

               rs.close();   

               stmt.close();   

               con.close();  

           }   

           return result;   

        }  

}

jsp显示

复制代码 代码如下:

web.xml中配置

复制代码 代码如下:

 

    genImage 

    ReadPhoto 

 

 

    genImage 

    /genImage 

希望本文所述对大家的Java程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java遍历HashMap简单的方法
下一篇:java实现上传图片进行切割的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~