共計 4799 個字符,預計需要花費 12 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
如何在 MySQL 中存儲圖片?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先,先要在數據庫中建表。我在名為 test 的數據庫下建立了一個叫 pic 的表。該表包括 3 列,idpic,caption 和 img。其中 idpic 是主鍵,caption 是對圖片的表述,img 是圖像文件本身。建表的 SQL 語句如下:
DROP TABLE IF EXISTS `test`.`pic`;
CREATE TABLE `test`.`pic` ( `idpic` int(11) NOT NULL auto_increment,
`caption` varchar(45) NOT NULL default ,
`img` longblob NOT NULL,
PRIMARY KEY (`idpic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
將上面的語句輸入到命令行中(如果安裝了 Query Brower,你可以按照參考 [1] 中的指示來建表,那樣會更加方便。),執行,表建立成功。
3 實現圖像存儲類
表完成后,我們就開始寫個 Java 類,來完成向數據庫中插入圖片的操作。我們知道,Java 與數據庫連接是通過 JDBC driver 來實現的。我用的是 MySQL 網站上提供的 MySQL Connector/J,如果你用的是其他類型的 driver,在下面的實現過程中可能會有些許差別。
3.1 裝載 JDBC 驅動,建立連接
JDK 中提供的 DriverManager 接口用來管理 Java Application 和 JDBC Driver 之間的連接。在使用這個接口之前,DriverManager 需要知道要連接的 JDBC 驅動。最簡單的方法就是用 Class.forName()來向 DriverManager 注冊實現了 java.sql.Driver 的接口類。對 MySQL Connector/ J 來說,這個類的名字叫 com.mysql.jdbc.Driver。
下面這個簡單的示例說明了怎樣來注冊 Connector/J Driver。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class LoadDriver { public static void main(String[] args) {
try { // The newInstance() call is a work around for some
// broken Java implementations
Class.forName(com.mysql.jdbc.Driver).newInstance();
// Connection con = DriverManager.getConnection(……)
// ……
} catch (Exception ex) {
// handle the error
}
}
向 DriverManager 注冊了驅動后,我們就可以通過調用 DriverManager.getConnection()方法來獲得和數據庫的連接。其實在上面的例子中就有這條語句,只不過被注釋掉了。在后面的實現中會有完整的例子。
3.2 PreparedStatement
完成上面的步驟后,我們就可以同過建立的連接創建 Statement 接口類,來執行一些 SQL 語句了。在下面的例子,我用的是 PreparedStatement,還有 CallableStatement,它可以執行一些存儲過程和函數,這里不多講了。下面的代碼片斷是向 pic 表中插入一條記錄。其中 (1) 處 Connection 接口的對象 con 通過調用 prepareStatement 方法得到預編譯的 SQL 語句(precompiled SQL statement);(2)處是為該 insert 語句的第一個問號賦值,(3)為第二個賦值,(4)為第三個,這步也是最該一提的,用的方法是 setBinaryStream(),第一個參數 3 是指第三個問號,fis 是一個二進制文件流,第三個參數是該文件流的長度。
PreparedStatement ps;
ps = con.prepareStatement(insert into PIC values (?,?,?) // (1)
ps.setInt(1, id); //(2)
ps.setString(2, file.getName()); (3)
ps.setBinaryStream(3, fis, (int)file.length()); (4)
ps.executeUpdate();
…
3.3 完整代碼
上面列出了完整的代碼。
package com.forrest.storepic;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
* This class describes how to store picture file into MySQL.
* @author Yanjiang Qian
* @version 1.0 Jan-02-2006
*/
public class StorePictures {
private String dbDriver;
private String dbURL;
private String dbUser;
private String dbPassword;
private Connection con;
private PreparedStatement ps;
public StorePictures() {
dbDriver = com.mysql.jdbc.Driver
dbURL = jdbc:mysql://localhost:3306/test
dbUser = root
dbPassword = admin
initDB();
}
public StorePictures(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());
}
}
public boolean storeImg(String strFile) throws Exception {
boolean written = false;
if (con == null)
written = false;
else {
int id = 0;
File file = new File(strFile);
FileInputStream fis = new FileInputStream(file);
try {
ps = con.prepareStatement(SELECT MAX(idpic) FROM PIC
ResultSet rs = ps.executeQuery();
if(rs != null) { while(rs.next()) { id = rs.getInt(1)+1;
}
} else {
return written;
}
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();
written = true;
} catch (SQLException e) {
written = false;
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();
// close db con
con.close();
}
}
return written;
}
/**
* Start point of the program
* @param args CMD line
*/
public static void main(String[] args) { if(args.length != 1) {
System.err.println( java StorePictures filename
System.exit(1);
}
boolean flag = false;
StorePictures sp = new StorePictures();
try { flag = sp.storeImg(args[0]);
} catch (Exception e) { e.printStackTrace();
}
if(flag) {
System.out.println( Picture uploading is successful.
} else {
System.out.println( Picture uploading is failed.
}
}
}
看完上述內容,你們掌握如何在 MySQL 中存儲圖片的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!
向 AI 問一下細節