歡迎您光臨本站 註冊首頁

通過Java或Jsp向資料庫存取二進位圖片

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  前幾天突然看到學校音樂站上的圖片原來是存儲在資料庫上的,是二進位而不是使用路徑保存的,在網上招了找發現大多介紹的都是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: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);

  可以很清楚的看到我們首先把一個圖片文件(當然也可以是別的什麼文件)轉換成了一個二進位輸入流


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

  這裡需要注意的是


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

  和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向資料庫存取二進位圖片已經有3552次圍觀

http://coctec.com/docs/java/show-post-61009.html