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

当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为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:log.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();   
  }   
  }  

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:log.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);  

InputStream photoStream = new FileInputStream(file);  

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

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

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程序将这个文件读出来,存储成一个图片文件\

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());   
  }   
  }   
  }  

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");  

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:log.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");   
  }   
  }  
/* 
  * 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:log.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>  





你可能感兴趣的:(java,jsp,数据库,exception,String,import)