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); } }
相关文章推荐
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
- 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day11~)(2016年1月27日13:12:11)
- 相关SpringSecurity对于部分菜单隐藏的相关代码
- Spring Security 取Session中的值和修改userDetails
- 阿里云Ubuntu下部署javaWeb项目
- 改善Java程序的151个建议--记录二(持续更新)
- Java内部类
- Java中enum的静态成员的初始化
- java 基础笔记
- java io流读写文件
- java基础笔记
- Java ConcurrentHashMap分析
- 【java】IO流
- 从头认识java-9.3 向容器添加一组数据与容器的打印
- Jsp+Servlet+JavaBean原生态开发问题集锦
- spirng中的asm与jdk不兼容<已解决>
- 第12周-显示一个棋盘
- 关于java的volatile关键字与线程栈的内容以及单例的DCL
- 简易遍历输出C盘java文件夹所有文件,并且拷贝到E盘。
- Struts2 XML配置