zoukankan      html  css  js  c++  java
  • java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

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

    在设计到数据库的开发中,难免要将图片或文档文件(如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.  
      }
  • 相关阅读:
    SharePoint Development
    win32- copyfile的使用
    SetWindowHookEx的复习
    C++ vector的使用
    关于char * 和 char [] 的一点理解
    CreateThread
    C++字符串大写字母转小写字母
    字符串逆序
    使用RegSetValueEx创建键值
    EnumColorProfiles WcsGetDefaultColorProfile WcsSetDefaultColorProfile的使用
  • 原文地址:https://www.cnblogs.com/sharpest/p/10366632.html
Copyright © 2011-2022 走看看