java 在MySQL中存儲文件,讀取文件(包括圖片,word文檔,excel表格,ppt,zip文件等)

轉自:https://blog.csdn.net/u014475796/article/details/49893261java

在設計到數據庫的開發中,不免要將圖片或文檔文件(如word)插入到數據庫中的狀況。通常來講,咱們能夠經過插入文件相應的存儲路徑,而不是文件自己,來避免直接向數據庫裏插入的麻煩。但有些時候,直接向MySQL中插入文件,更加安全,並且更加容易管理。
首先,先要在數據庫中建表。我在名爲test的數據庫下創建了一個叫pic的表。該表包括3列,id, caption和img。其中id是主鍵,caption是對圖片的表述,img是圖像文件自己。建表的SQL語句以下:
  1.  
    DROP TABLE IF EXISTS `test`.`pic`;
  2.  
    CREATE TABLE `test`.`pic` (
  3.  
    `id` int(11) NOT NULL auto_increment,
  4.  
    `caption` varchar(45) NOT NULL default '',
  5.  
    `img` longblob NOT NULL,
  6.  
    PRIMARY KEY (`id`)
  7.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其次,在java中對文件(如圖片,word文檔等)的處理,其中包括把文件存儲到數據庫和從數據庫中讀取文件。(注:storeImg()和readImg()是能夠處理任意文件類型的,不單單是圖片)
</pre><pre name="code" class="sql">  在數據庫裏存儲文件以及從數據庫讀取文件的完整代碼以下:
  1.  
    <pre name="code" class="java">import java.io.*;
  2.  
    import java.sql.*;
  3.  
    public class StoreFile {
  4.  
     
  5.  
    private String dbDriver;
  6.  
    private String dbURL;
  7.  
    private String dbUser;
  8.  
    private String dbPassword;
  9.  
    private Connection con;
  10.  
    private PreparedStatement ps;
  11.  
    /**
  12.  
    * 構造函數,初始化數據庫的鏈接
  13.  
    *
  14.  
    */
  15.  
    public StoreFile() {
  16.  
    dbDriver = "com.mysql.jdbc.Driver";
  17.  
    dbURL = "jdbc:mysql://localhost:3306/test";
  18.  
    dbUser = "root";
  19.  
    dbPassword = "justdoit";
  20.  
    initDB();
  21.  
    }
  22.  
    public StoreFile(String strDriver, String strURL,
  23.  
    String strUser, String strPwd) {
  24.  
    dbDriver = strDriver;
  25.  
    dbURL = strURL;
  26.  
    dbUser = strUser;
  27.  
    dbPassword = strPwd;
  28.  
    initDB();
  29.  
    }
  30.  
     
  31.  
    public void initDB() {
  32.  
    try {
  33.  
    // Load Driver
  34.  
    Class.forName(dbDriver).newInstance();
  35.  
    // Get connection
  36.  
    con = DriverManager.getConnection(dbURL,
  37.  
    dbUser, dbPassword);
  38.  
    } catch(ClassNotFoundException e) {
  39.  
    System.out.println(e.getMessage());
  40.  
    } catch(SQLException ex) {
  41.  
    // handle any errors
  42.  
    System.out.println("SQLException: " + ex.getMessage());
  43.  
    System.out.println("SQLState: " + ex.getSQLState());
  44.  
    System.out.println("VendorError: " + ex.getErrorCode());
  45.  
     
  46.  
    } catch (Exception e) {
  47.  
    System.out.println(e.getMessage());
  48.  
    }
  49.  
    }
  50.  
    /**
  51.  
    * 將指定路徑的文件(好比:圖片,word文檔等)存儲到數據庫
  52.  
    * @param strFile 要存放到數據庫的文件路徑,如D:\\a.jpg
  53.  
    */
  54.  
    public void storeImg(String strFile) throws Exception {
  55.  
    int id = 0;
  56.  
    File file = new File(strFile);
  57.  
    FileInputStream fis = new FileInputStream(file);
  58.  
    try {
  59.  
    ps = con.prepareStatement(" insert "
  60.  
    + "into PIC values (?,?,?)");
  61.  
    ps.setInt(1, id);
  62.  
    ps.setString(2, file.getName());
  63.  
    ps.setBinaryStream(3, fis, (int) file.length());
  64.  
    ps.executeUpdate();
  65.  
    System.out.println("file insert success ");
  66.  
    } catch (SQLException e) {
  67.  
    System.out.println("SQLException: "
  68.  
    + e.getMessage());
  69.  
    System.out.println("SQLState: "
  70.  
    + e.getSQLState());
  71.  
    System.out.println("VendorError: "
  72.  
    + e.getErrorCode());
  73.  
    e.printStackTrace();
  74.  
    } finally {
  75.  
    ps.close();
  76.  
    fis.close();
  77.  
    con.close();
  78.  
    }
  79.  
    }
  80.  
    /**
  81.  
    * 將存儲在數據庫中的文件(好比:圖片,word文檔等)讀取到指定路徑
  82.  
    * @param path 從數據庫裏讀取出來的文件存放路徑 如D:\\a.jpg
  83.  
    * @param id 數據庫裏記錄的id
  84.  
    */
  85.  
    public void readImg(String path, int id) throws Exception{
  86.  
    initDB(); //創建與數據庫的鏈接
  87.  
    byte[] buffer = new byte[4096];
  88.  
    FileOutputStream outputImage = null;
  89.  
    InputStream is = null;
  90.  
    try {
  91.  
    ps = con.prepareStatement("select img from pic where id =?");
  92.  
    ps.setInt(1, id);
  93.  
    ResultSet rs = ps.executeQuery();
  94.  
    rs.next();
  95.  
    File file = new File(path);
  96.  
    if (!file.exists()) {
  97.  
    file.createNewFile();
  98.  
    }
  99.  
    outputImage = new FileOutputStream(file);
  100.  
    Blob blob = rs.getBlob("img"); //img爲數據庫存放圖片字段名稱
  101.  
    is = blob.getBinaryStream();
  102.  
    int size = 0;
  103.  
    while ((size = is.read(buffer)) != -1) {
  104.  
    outputImage.write(buffer, 0, size);
  105.  
    }
  106.  
    System.out.println("file read success ");
  107.  
    } catch (Exception e) {
  108.  
    e.printStackTrace();
  109.  
    } finally {
  110.  
    is.close();
  111.  
    outputImage.close();
  112.  
    ps.close();
  113.  
    con.close();
  114.  
    }
  115.  
    }
  116.  
     
  117.  
    public static void main(String[] args) throws Exception {
  118.  
    StoreFile sp = new StoreFile();
  119.  
    String imgPath="C:\\Users\\Administrator\\Pictures\\img12.jpg";
  120.  
    //String wordPath="d:\\測試文檔.docx";
  121.  
    sp.storeImg(imgPath);
  122.  
    //sp.storeImg(wordPath);
  123.  
    //sp.readImg("D://數據庫.jpg", 1); //這裏的1爲要傳入的參數:讀取文件的id
  124.  
    //sp.readImg("D://數據庫.docx", 8);
  125.  
    }
  126.  
    }
相關文章
相關標籤/搜索