轉自:https://blog.csdn.net/u014475796/article/details/49893261java
在設計到數據庫的開發中,不免要將圖片或文檔文件(如word)插入到數據庫中的狀況。通常來講,咱們能夠經過插入文件相應的存儲路徑,而不是文件自己,來避免直接向數據庫裏插入的麻煩。但有些時候,直接向MySQL中插入文件,更加安全,並且更加容易管理。
首先,先要在數據庫中建表。我在名爲test的數據庫下創建了一個叫pic的表。該表包括3列,id, caption和img。其中id是主鍵,caption是對圖片的表述,img是圖像文件自己。建表的SQL語句以下:
-
DROP TABLE IF EXISTS `test`.`pic`;
-
CREATE TABLE `test`.`pic` (
-
`id` int(11) NOT NULL auto_increment,
-
`caption` varchar(45) NOT NULL default '',
-
`img` longblob NOT NULL,
-
PRIMARY KEY (`id`)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其次,在java中對文件(如圖片,word文檔等)的處理,其中包括把文件存儲到數據庫和從數據庫中讀取文件。(注:storeImg()和readImg()是能夠處理任意文件類型的,不單單是圖片)
</pre><pre name="code" class="sql"> 在數據庫裏存儲文件以及從數據庫讀取文件的完整代碼以下:
-
<pre name="code" class="java">import java.io.*;
-
import java.sql.*;
-
public class StoreFile {
-
-
private String dbDriver;
-
private String dbURL;
-
private String dbUser;
-
private String dbPassword;
-
private Connection con;
-
private PreparedStatement ps;
-
/**
-
* 構造函數,初始化數據庫的鏈接
-
*
-
*/
-
public StoreFile() {
-
dbDriver = "com.mysql.jdbc.Driver";
-
dbURL = "jdbc:mysql://localhost:3306/test";
-
dbUser = "root";
-
dbPassword = "justdoit";
-
initDB();
-
}
-
public StoreFile(String strDriver, String strURL,
-
String strUser, String strPwd) {
-
dbDriver = strDriver;
-
dbURL = strURL;
-
dbUser = strUser;
-
dbPassword = strPwd;
-
initDB();
-
}
-
-
public void initDB() {
-
try {
-
// Load Driver
-
Class.forName(dbDriver).newInstance();
-
// Get connection
-
con = DriverManager.getConnection(dbURL,
-
dbUser, dbPassword);
-
} catch(ClassNotFoundException e) {
-
System.out.println(e.getMessage());
-
} catch(SQLException ex) {
-
// handle any errors
-
System.out.println("SQLException: " + ex.getMessage());
-
System.out.println("SQLState: " + ex.getSQLState());
-
System.out.println("VendorError: " + ex.getErrorCode());
-
-
} catch (Exception e) {
-
System.out.println(e.getMessage());
-
}
-
}
-
/**
-
* 將指定路徑的文件(好比:圖片,word文檔等)存儲到數據庫
-
* @param strFile 要存放到數據庫的文件路徑,如D:\\a.jpg
-
*/
-
public void storeImg(String strFile) throws Exception {
-
int id = 0;
-
File file = new File(strFile);
-
FileInputStream fis = new FileInputStream(file);
-
try {
-
ps = con.prepareStatement(" insert "
-
+ "into PIC values (?,?,?)");
-
ps.setInt(1, id);
-
ps.setString(2, file.getName());
-
ps.setBinaryStream(3, fis, (int) file.length());
-
ps.executeUpdate();
-
System.out.println("file insert success ");
-
} catch (SQLException e) {
-
System.out.println("SQLException: "
-
+ e.getMessage());
-
System.out.println("SQLState: "
-
+ e.getSQLState());
-
System.out.println("VendorError: "
-
+ e.getErrorCode());
-
e.printStackTrace();
-
} finally {
-
ps.close();
-
fis.close();
-
con.close();
-
}
-
}
-
/**
-
* 將存儲在數據庫中的文件(好比:圖片,word文檔等)讀取到指定路徑
-
* @param path 從數據庫裏讀取出來的文件存放路徑 如D:\\a.jpg
-
* @param id 數據庫裏記錄的id
-
*/
-
public void readImg(String path, int id) throws Exception{
-
initDB(); //創建與數據庫的鏈接
-
byte[] buffer = new byte[4096];
-
FileOutputStream outputImage = null;
-
InputStream is = null;
-
try {
-
ps = con.prepareStatement("select img from pic where id =?");
-
ps.setInt(1, id);
-
ResultSet rs = ps.executeQuery();
-
rs.next();
-
File file = new File(path);
-
if (!file.exists()) {
-
file.createNewFile();
-
}
-
outputImage = new FileOutputStream(file);
-
Blob blob = rs.getBlob("img"); //img爲數據庫存放圖片字段名稱
-
is = blob.getBinaryStream();
-
int size = 0;
-
while ((size = is.read(buffer)) != -1) {
-
outputImage.write(buffer, 0, size);
-
}
-
System.out.println("file read success ");
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally {
-
is.close();
-
outputImage.close();
-
ps.close();
-
con.close();
-
}
-
}
-
-
public static void main(String[] args) throws Exception {
-
StoreFile sp = new StoreFile();
-
String imgPath="C:\\Users\\Administrator\\Pictures\\img12.jpg";
-
//String wordPath="d:\\測試文檔.docx";
-
sp.storeImg(imgPath);
-
//sp.storeImg(wordPath);
-
//sp.readImg("D://數據庫.jpg", 1); //這裏的1爲要傳入的參數:讀取文件的id
-
//sp.readImg("D://數據庫.docx", 8);
-
}
-
}