java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

时间:2023-03-09 18:37:03
java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

转自:https://blog.****.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. private String dbDriver;
  5. private String dbURL;
  6. private String dbUser;
  7. private String dbPassword;
  8. private Connection con;
  9. private PreparedStatement ps;
  10. /**
  11. * 构造函数,初始化数据库的连接
  12. *
  13. */
  14. public StoreFile() {
  15. dbDriver = "com.mysql.jdbc.Driver";
  16. dbURL = "jdbc:mysql://localhost:3306/test";
  17. dbUser = "root";
  18. dbPassword = "justdoit";
  19. initDB();
  20. }
  21. public StoreFile(String strDriver, String strURL,
  22. String strUser, String strPwd) {
  23. dbDriver = strDriver;
  24. dbURL = strURL;
  25. dbUser = strUser;
  26. dbPassword = strPwd;
  27. initDB();
  28. }
  29. public void initDB() {
  30. try {
  31. // Load Driver
  32. Class.forName(dbDriver).newInstance();
  33. // Get connection
  34. con = DriverManager.getConnection(dbURL,
  35. dbUser, dbPassword);
  36. } catch(ClassNotFoundException e) {
  37. System.out.println(e.getMessage());
  38. } catch(SQLException ex) {
  39. // handle any errors
  40. System.out.println("SQLException: " + ex.getMessage());
  41. System.out.println("SQLState: " + ex.getSQLState());
  42. System.out.println("VendorError: " + ex.getErrorCode());
  43. } catch (Exception e) {
  44. System.out.println(e.getMessage());
  45. }
  46. }
  47. /**
  48. * 将指定路径的文件(比如:图片,word文档等)存储到数据库
  49. * @param strFile 要存放到数据库的文件路径,如D:\\a.jpg
  50. */
  51. public void storeImg(String strFile) throws Exception {
  52. int id = 0;
  53. File file = new File(strFile);
  54. FileInputStream fis = new FileInputStream(file);
  55. try {
  56. ps = con.prepareStatement("insert "
  57. + "into PIC values (?,?,?)");
  58. ps.setInt(1, id);
  59. ps.setString(2, file.getName());
  60. ps.setBinaryStream(3, fis, (int) file.length());
  61. ps.executeUpdate();
  62. System.out.println("file insert success ");
  63. } catch (SQLException e) {
  64. System.out.println("SQLException: "
  65. + e.getMessage());
  66. System.out.println("SQLState: "
  67. + e.getSQLState());
  68. System.out.println("VendorError: "
  69. + e.getErrorCode());
  70. e.printStackTrace();
  71. } finally {
  72. ps.close();
  73. fis.close();
  74. con.close();
  75. }
  76. }
  77. /**
  78. * 将存储在数据库中的文件(比如:图片,word文档等)读取到指定路径
  79. * @param path 从数据库里读取出来的文件存放路径 如D:\\a.jpg
  80. * @param id 数据库里记录的id
  81. */
  82. public void readImg(String path, int id) throws Exception{
  83. initDB(); //建立与数据库的连接
  84. byte[] buffer = new byte[4096];
  85. FileOutputStream outputImage = null;
  86. InputStream is = null;
  87. try {
  88. ps = con.prepareStatement("select img from pic where id =?");
  89. ps.setInt(1, id);
  90. ResultSet rs = ps.executeQuery();
  91. rs.next();
  92. File file = new File(path);
  93. if (!file.exists()) {
  94. file.createNewFile();
  95. }
  96. outputImage = new FileOutputStream(file);
  97. Blob blob = rs.getBlob("img"); //img为数据库存放图片字段名称
  98. is = blob.getBinaryStream();
  99. int size = 0;
  100. while ((size = is.read(buffer)) != -1) {
  101. outputImage.write(buffer, 0, size);
  102. }
  103. System.out.println("file read success ");
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. } finally {
  107. is.close();
  108. outputImage.close();
  109. ps.close();
  110. con.close();
  111. }
  112. }
  113. public static void main(String[] args) throws Exception {
  114. StoreFile sp = new StoreFile();
  115. String imgPath="C:\\Users\\Administrator\\Pictures\\img12.jpg";
  116. //String wordPath="d:\\测试文档.docx";
  117. sp.storeImg(imgPath);
  118. //sp.storeImg(wordPath);
  119. //sp.readImg("D://数据库.jpg", 1); //这里的1为要传入的参数:读取文件的id
  120. //sp.readImg("D://数据库.docx", 8);
  121. }
  122. }