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.   }

相关文章