您的位置:首页 > 编程语言 > Java开发

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

2015-11-17 21:09 211 查看
在设计到数据库的开发中,难免要将图片或文档文件(如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);
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: