用Java或Jsp向数据库存取二进制图片

前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件在数据库中要搞清楚下面几个内容:

  1 MySQL存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的

  2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流

  废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob

  1.    package com.lizhe;   
  2.   import Java.io.*;   
  3.   import java.sql.*;   
  4.   public class PutImg {   
  5.   public void putimg() {   
  6.   try {   
  7.   Class.forName("org.gjt.mm.mysql.Driver").newInstance();   
  8.   String url = "JDBC:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";   
  9.   Connection conn = DriverManager.getConnection(url);   
  10.   Statement stmt = conn.createStatement();   
  11.   //stmt.execute("insert into imgt (id) values (5)");   
  12.   stmt.close();   
  13.   PreparedStatement pstmt = null;   
  14.   String sql = "";   
  15.   File file = new File("c:log.jpg");   
  16.   InputStream photoStream = new FileInputStream(file);   
  17.   //sql = " UPDATE imgt SET img = ? ";   
  18.   sql = "INSERT INTO imgtable (img) VALUES (?)";   
  19.   pstmt = conn.prepareStatement(sql);   
  20.   pstmt.setBinaryStream(1, photoStream, (int) file.length());   
  21.   pstmt.executeUpdate();   
  22.   pstmt.close();   
  23.   conn.close();   
  24.   } catch (Exception e) {   
  25.   e.printStackTrace();   
  26.   }   
  27.   }   
  28.   public static void main(String args[]){   
  29.   PutImg pi=new PutImg();   
  30.   pi.putimg();   
  31.   }   
  32.   }  

 
  1.  InputStream photoStream = new FileInputStream(file);  


  可以很清楚的看到我们首先把一个图片文件(当然也可以是别的什么文件)转换成了一个二进制输入流

  1.  pstmt.setBinaryStream(1, photoStream, (int) file.length());  


  这个方法建议大家去查一下API文档,第一个参数是通配符位置没的说,第二个参数是流,这和以往的string类型的参数不太一样,我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字符串参数,这里我们还需要第三个参数来设置这个流的长度,这里也就是这个文件的长度,导出数据库中的sql,一切都清楚了

  INSERT INTO `m_diy` VALUES (2,? JFIF HH?? ExifMM* b j ( 1 r 2 ?i H H Adobe Photoshop CS Windows2007:03:18 23:08:15 ? ??? ? ........等等

  其实就是将文件先转换成了二进制的流,然后插入到了sql语言中,向数据库写入了很长很长的一段sql语句

  然后我们再来写一个app程序将这个文件读出来,存储成一个图片文件


 
  1. package com.lizhe;   
  2.   import Java.io.*;   
  3.   import java.sql.*;   
  4.   class GetImg {   
  5.   private static final String URL = "JDBC:MySQL://localhost/img?user=root&password   
  6.   =root&useUnicode=true&characterEncoding=gbk";   
  7.   private Connection conn = null;   
  8.   private PreparedStatement pstmt = null;   
  9.   private ResultSet rs = null;   
  10.   private File file = null;   
  11.   public void blobRead(String outfile, int picID) throws Exception {   
  12.   FileOutputStream fos = null;   
  13.   InputStream is = null;   
  14.   byte[] Buffer = new byte[4096];   
  15.   try {   
  16.   Class.forName("org.gjt.mm.mysql.Driver").newInstance();   
  17.   conn = DriverManager.getConnection(URL);   
  18.   pstmt = conn.prepareStatement("select img from imgt where id=?");   
  19.   pstmt.setInt(1, picID); // 传入要取的图片的ID   
  20.   rs = pstmt.executeQuery();   
  21.   rs.next();   
  22.   file = new File(outfile);   
  23.   if (!file.exists()) {   
  24.   file.createNewFile(); // 如果文件不存在,则创建   
  25.   }   
  26.   fos = new FileOutputStream(file);   
  27.   is = rs.getBinaryStream("img");   
  28.   int size = 0;   
  29.   while ((size = is.read(Buffer)) != -1) {   
  30.   // System.out.println(size);   
  31.   fos.write(Buffer, 0, size);   
  32.   }   
  33.   } catch (Exception e) {   
  34.   System.out.println( e.getMessage());   
  35.   } finally {   
  36.   // 关闭用到的资源   
  37.   fos.close();   
  38.   rs.close();   
  39.   pstmt.close();   
  40.   conn.close();   
  41.   }   
  42.   }   
  43.   public static void main(String[] args) {   
  44.   try {   
  45.   GetImg gi=new GetImg();   
  46.   gi.blobRead("c:/getimgs/1.jpg", 5);   
  47.   } catch (Exception e) {   
  48.   System.out.println("[Main func error: ]" + e.getMessage());   
  49.   }   
  50.   }   
  51.   }  


  这里需要注意的是


  1.  is = rs.getBinaryStream("img");  


  img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的

  最后在帖两个bs系统上用的文件给大家参考

  通过Struts的action向数据库写入二进制图片


 
  1. /*  
  2.   * Generated by MyEclipse Struts  
  3.   * Template path: templates/Java/JavaClass.vtl  
  4.   */   
  5.   package com.lizhe.struts.action;   
  6.   import java.io.File;   
  7.   import java.io.FileInputStream;   
  8.   import java.io.FileNotFoundException;   
  9.   import java.io.IOException;   
  10.   import java.io.InputStream;   
  11.   import java.sql.Connection;   
  12.   import java.sql.DriverManager;   
  13.   import java.sql.PreparedStatement;   
  14.   import java.sql.Statement;   
  15.   import javax.Servlet.http.HttpServletRequest;   
  16.   import javax.servlet.http.HttpServletResponse;   
  17.   import org.apache.struts.action.Action;   
  18.   import org.apache.struts.action.ActionForm;   
  19.   import org.apache.struts.action.ActionForward;   
  20.   import org.apache.struts.action.ActionMapping;   
  21.   import org.apache.struts.upload.FormFile;   
  22.   import com.lizhe.struts.form.UpimgForm;   
  23.   /**  
  24.   * MyEclipse Struts  
  25.   * Creation date: 05-18-2007  
  26.   *  
  27.   * XDoclet definition:  
  28.   * @struts.action path="/upimg" name="upimgForm" input="/userhomepage.JSP"  
  29.   * @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"  
  30.   */   
  31.   public class UpimgAction extends Action {   
  32.   /*  
  33.   * Generated Methods  
  34.   */   
  35.   /**  
  36.   * Method execute  
  37.   * @param mapping  
  38.   * @param form  
  39.   * @param request  
  40.   * @param response  
  41.   * @return ActionForward  
  42.   * @throws IOException  
  43.   * @throws FileNotFoundException  
  44.   */   
  45.   public ActionForward execute(ActionMapping mapping, ActionForm form,   
  46.   HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {   
  47.   UpimgForm upimgForm = (UpimgForm) form;// TODO Auto-generated method stub   
  48.   FormFile file=upimgForm.getFile();   
  49.   InputStream is=file.getInputStream();   
  50.   try {   
  51.   Class.forName("org.gjt.mm.MySQL.Driver").newInstance();   
  52.   String url = "JDBC:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312";   
  53.   Connection conn = DriverManager.getConnection(url);   
  54.   Statement stmt = conn.createStatement();   
  55.   //stmt.execute("insert  into  img (id)  values  (5)");   
  56.   stmt.close();   
  57.   PreparedStatement pstmt = null;   
  58.   String sql = "";   
  59.   //File file = new File("c:log.jpg");   
  60.   //InputStream photoStream = new FileInputStream(file);   
  61.   //sql = "  UPDATE  imgt  SET  img  =  ?  ";   
  62.   sql = "INSERT INTO img (img) VALUES (?)";   
  63.   pstmt = conn.prepareStatement(sql);   
  64.   pstmt.setBinaryStream(1, is, (int) file.getFileSize());   
  65.   pstmt.executeUpdate();   
  66.   pstmt.close();   
  67.   conn.close();   
  68.   } catch (Exception e) {   
  69.   e.printStackTrace();   
  70.   }   
  71.   return mapping.findForward("userhomepage");   
  72.   }   
  73.   }  


  和app的方式几乎是一样的

  第二个文件是通过jsp将数据库中的图片显示在页面上

  这个有些不同

 

 
  1. < %@  page  contentType="text/html;charset=gb2312"%>   
  2.   < %@  page  import="java.sql.*"  %>   
  3.   < %@  page  import="java.util.*"%>   
  4.   < %@  page  import="java.text.*"%>   
  5.   < %@  page  import="java.io.*"%>   
  6.   < %@  page  import="java.awt.*"%>   
  7.   < html>   
  8.   < body>   
  9.   < %   
  10.   Class.forName("org.gjt.mm.mysql.Driver").newInstance();   
  11.   String url="jdbc:mysql://localhost/img?user=root&password=root";   
  12.   Connection  con  =  DriverManager.getConnection(url);   
  13.   String  sql  =  "select  *  from imgt where id=5";   
  14.   Statement stmt = con.createStatement();   
  15.   ResultSet rs = stmt.executeQuery(sql);   
  16.   if(rs.next()) {   
  17.   InputStream in = rs.getBinaryStream("img");   
  18.   ServletOutputStream op = response.getOutputStream();   
  19.   int len;   
  20.   byte[] buf=new byte[1024];   
  21.   while((len= in.read(buf))!=-1) {   
  22.   op.write(buf, 0, len);   
  23.   }   
  24.   op.close();   
  25.   in.close();   
  26.   }   
  27.   rs.close();   
  28.   stmt.close();   
  29.   con.close();   
  30.   %>   
  31.   < /body>   
  32.   < /html>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值