dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>文章内容
如何通过java或jsp向数据库存取二进制图片
来源: 作者:
前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件在数据库中要搞清楚下面几个内容:
1   mysql存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的
2   要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流
废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob
package com.lizhe;
import java.io.*;
import java.sql.*;
public class PutImg {
 public void putimg() {
  try {
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   String url = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
   Connection conn = DriverManager.getConnection(url);
   Statement stmt = conn.createStatement();
   //stmt.execute("insert   into   imgt (id)   values   (5)");
   stmt.close();
   PreparedStatement pstmt = null;
   String sql = "";
   File file = new File("c:\\blog.jpg");
   InputStream photoStream = new FileInputStream(file);
   //sql = "   UPDATE   imgt   SET   img   =   ?   ";
     
   sql = "INSERT INTO imgtable  (img) VALUES (?)";
   
   pstmt = conn.prepareStatement(sql);
   pstmt.setBinaryStream(1, photoStream, (int) file.length());
   pstmt.executeUpdate();
   pstmt.close();
   conn.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static void main(String args[]){
  PutImg pi=new PutImg();
  pi.putimg();
 }
}
 
InputStream photoStream = new FileInputStream(file);
可以很清楚的看到我们首先把一个图片文件(当然也可以是别的什么文件)转换成了一个二进制输入流
pstmt.setBinaryStream(1, photoStream, (int) file.length());
这个方法建议大家去查一下API文档,第一个参数是通配符位置没的说,第二个参数是流,这和以往的string类型的参数不太一样,我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字符串参数,这里我们还需要第三个参数来设置这个流的长度,这里也就是这个文件的长度,导出数据库中的sql, 一切都清楚了
INSERT INTO `m_diy` VALUES (2,?\0 JFIF\0   \0H\0H\0\0?? Exif\0\0MM \0*\0\0\0 \0  \0 \0\0\0 \0 \0\0  \0 \0\0\0 \0\0\0b  \0 \0\0\0 \0\0\0j (\0  \0\0\0 \0 \0\0 1\0 \0\0\0 \0\0\0r 2\0 \0\0\0 \0\0\0?i\0 \0\0\0 \0\0\0\0\0 \0\0\0\0H\0\0\0 \0\0\0H\0\0\0 Adobe Photoshop CS Windows\02007:03:18 23:08: 15\0\0\0\0\0 ?\0 \0\0\0 ??\0\0?\0 \0\0\0 \0\0\0? \0 ........等等
其实就是将文件先转换成了二进制的流,然后插入到了sql语言中,向数据库写入了很长很长的一段sql语句

 
 
然后我们再来写一个app程序将这个文件读出来,存储成一个图片文件
package com.lizhe;
import java.io.*;
import java.sql.*;
class GetImg {
 
 private static final String URL = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
 private Connection conn = null; 
 private PreparedStatement pstmt = null; 
 private ResultSet rs = null; 
 private File file = null; 

 public void blobRead(String outfile, int picID) throws Exception {
  FileOutputStream fos = null;
  InputStream is = null;
  byte[] Buffer = new byte[4096];
  try {
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   conn = DriverManager.getConnection(URL);
   pstmt = conn.prepareStatement("select img from imgt where id=?");
   pstmt.setInt(1, picID); // 传入要取的图片的ID
   rs = pstmt.executeQuery();
   rs.next();
   file = new File(outfile);
   if (!file.exists()) {
    file.createNewFile(); // 如果文件不存在,则创建
   }
   fos = new FileOutputStream(file);
   is = rs.getBinaryStream("img");
   int size = 0;
   
   while ((size = is.read(Buffer)) != -1) {
    // System.out.println(size);
    fos.write(Buffer, 0, size);
   }
  } catch (Exception e) {
   System.out.println( e.getMessage());
  } finally {
   // 关闭用到的资源
   fos.close();
   rs.close();
   pstmt.close();
   conn.close();
  }
 }
 public static void main(String[] args) {
  try {
   GetImg gi=new GetImg();
   gi.blobRead("c:/getimgs/1.jpg", 5);
  } catch (Exception e) {
   System.out.println("[Main func error: ]" + e.getMessage());
  }
 }
}
这里需要注意的是
 is = rs.getBinaryStream("img");
img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的
最后在帖两个bs系统上用的文件给大家参考
通过struts的action向数据库写入二进制图片
/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 */
package com.lizhe.struts.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import com.lizhe.struts.form.UpimgForm;
/** 
 * MyEclipse Struts
 * Creation date: 05-18-2007
 * 
 * XDoclet definition:
 * @struts.action path="/upimg" name="upimgForm" input="/userhomepage.jsp"
 * @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"
 */
public class UpimgAction extends Action {
 /*
  * Generated Methods
  */
 /** 
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  * @throws IOException 
  * @throws FileNotFoundException 
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {
  UpimgForm upimgForm = (UpimgForm) form;// TODO Auto-generated method stub
  
  FormFile file=upimgForm.getFile();
  InputStream is=file.getInputStream();
  
  try {
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   String url = "jdbc:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312";
   Connection conn = DriverManager.getConnection(url);
   Statement stmt = conn.createStatement();
   //stmt.execute("insert   into   img (id)   values   (5)");
   stmt.close();
   PreparedStatement pstmt = null;
   String sql = "";
   //File file = new File("c:\\blog.jpg");
   //InputStream photoStream = new FileInputStream(file);
   //sql = "   UPDATE   imgt   SET   img   =   ?   ";
     
   sql = "INSERT INTO img (img) VALUES (?)";
   
   pstmt = conn.prepareStatement(sql);
   pstmt.setBinaryStream(1, is, (int) file.getFileSize());
   pstmt.executeUpdate();
   pstmt.close();
   conn.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  return mapping.findForward("userhomepage");
 }
}
和app的方式几乎是一样的
第二个文件是通过jsp将数据库中的图片显示在页面上
这个有些不同
<%@   page   contentType="text/html;charset=gb2312"%>     
  <%@   page   import="java.sql.*"   %>     
  <%@   page   import="java.util.*"%>     
  <%@   page   import="java.text.*"%>     
  <%@   page   import="java.io.*"%>     
<%@   page   import="java.awt.*"%> 
  <html>     
  <body>     
  <%   
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    String url="jdbc:mysql://localhost/img?user=root&password=root";
   Connection   con   =   DriverManager.getConnection(url);      
   String   sql   =   "select   *   from  imgt where id=5";     
   Statement stmt = con.createStatement(); 
   
   ResultSet rs = stmt.executeQuery(sql); 
   if(rs.next()) {  
    InputStream in = rs.getBinaryStream("img"); 
    ServletOutputStream op = response.getOutputStream(); 
    int len; 
    byte[] buf=new byte[1024]; 
    while((len= in.read(buf))!=-1) { 
     op.write(buf, 0, len); 
    } 
    op.close(); 
    in.close(); 
   } 
   
   rs.close(); 
   stmt.close(); 
    con.close(); 
  %>     
  </body>     
  </html> 

上一篇:JDOM、Schema验证xml文件   下一篇:JDOM入门
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·java自学路线图
·JSP入门实例教程
·JUnit单元测试(2)
·JUnit单元测试(1)
·什么是Servlet
·用AJAX+J2EE实现网上会议室系统
·浅谈在Java语言中究竟是传值还是
·Java 5.0 多线程编程实践
·Java的文件 读和写
·构造器内部的多态方法的行为
·JSP常用内置对象使用说明
·对于JAVA基础测试中常见的异常问
  相关文章
·JDOM、Schema验证xml文件
·JDOM入门
·SAXBuilder,Document,Element
·如何使用java向mysql存取二进制
·解析MySQL数据类型 避免数据库设
·mysql操作blob经验谈
·Java DBJava 6 里的数据库
·使用二进制方法保存图片
·j2se 6 的新特性
·非常简单的mysql的BlobTest实例
·hibernate增删改查代码实例
·JAVA写的MP3标签读写器
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763