用Java或Jsp向数据库存取二进制图片
2019獨角獸企業重金招聘Python工程師標準>>>
?前幾天突然看到學校音樂站上的圖片原來是存儲在數據庫上的,是二進制而不是使用路徑保存的,在網上招了找發現大多介紹的都是hph方式,在這里做個總結,首先要存儲二進制文件在數據庫中要搞清楚下面幾個內容:1 MySQL存儲大容量的二進制文件的格式是blob,其實除了圖片還可以存別的
2 要向數據庫存儲二進制的文件一定要把要存儲的數據轉換成二進制流
廢話就不多說了,大家看看代碼很容易明白,先來看一個app程序,當然首先您要在數據庫中先建立一個用于保存圖片的表和相應的列,數據格式為blob
? package?com.lizhe; import?Java.io.*; import?java.sql.*; public?class?PutImg?{ public?void?putimg()?{ try?{ Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String?url?=?"JDBC:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk"; Connection?conn?=?DriverManager.getConnection(url); Statement?stmt?=?conn.createStatement(); //stmt.execute("insert?into?imgt?(id)?values?(5)"); stmt.close(); PreparedStatement?pstmt?=?null; String?sql?=?""; File?file?=?new?File("c:log.jpg"); InputStream?photoStream?=?new?FileInputStream(file); //sql?=?"?UPDATE?imgt?SET?img?=???"; sql?=?"INSERT?INTO?imgtable?(img)?VALUES?(?)"; pstmt?=?conn.prepareStatement(sql); pstmt.setBinaryStream(1,?photoStream,?(int)?file.length()); pstmt.executeUpdate(); pstmt.close(); conn.close(); }?catch?(Exception?e)?{ e.printStackTrace(); } } public?static?void?main(String?args[]){ PutImg?pi=new?PutImg(); pi.putimg(); } } |
InputStream photoStream = new FileInputStream(file);
可以很清楚的看到我們首先把一個圖片文件(當然也可以是別的什么文件)轉換成了一個二進制輸入流
pstmt.setBinaryStream(1,?photoStream,?(int)?file.length()); |
這個方法建議大家去查一下API文檔,第一個參數是通配符位置沒的說,第二個參數是流,這和以往的string類型的參數不太一樣,我剛看到的時候也覺得豁然開朗了,但是到這里還沒完,不同于以往的字符串參數,這里我們還需要第三個參數來設置這個流的長度,這里也就是這個文件的長度,導出數據庫中的sql,一切都清楚了
INSERT INTO `m_diy` VALUES (2,? JFIF HH?? ExifMM* b j ( 1 r 2 ?i H H Adobe Photoshop CS Windows2007:03:18 23:08:15 ? ??? ? ........等等
其實就是將文件先轉換成了二進制的流,然后插入到了sql語言中,向數據庫寫入了很長很長的一段sql語句
然后我們再來寫一個app程序將這個文件讀出來,存儲成一個圖片文件
? package?com.lizhe; import?Java.io.*; import?java.sql.*; class?GetImg?{ private?static?final?String?URL?=?"JDBC:MySQL://localhost/img?user=root&password =root&useUnicode=true&characterEncoding=gbk"; private?Connection?conn?=?null; private?PreparedStatement?pstmt?=?null; private?ResultSet?rs?=?null; private?File?file?=?null; public?void?blobRead(String?outfile,?int?picID)?throws?Exception?{ FileOutputStream?fos?=?null; InputStream?is?=?null; byte[]?Buffer?=?new?byte[4096]; try?{ Class.forName("org.gjt.mm.mysql.Driver").newInstance(); conn?=?DriverManager.getConnection(URL); pstmt?=?conn.prepareStatement("select?img?from?imgt?where?id=?"); pstmt.setInt(1,?picID);?//?傳入要取的圖片的ID rs?=?pstmt.executeQuery(); rs.next(); file?=?new?File(outfile); if?(!file.exists())?{ file.createNewFile();?//?如果文件不存在,則創建 } fos?=?new?FileOutputStream(file); is?=?rs.getBinaryStream("img"); int?size?=?0; while?((size?=?is.read(Buffer))?!=?-1)?{ //?System.out.println(size); fos.write(Buffer,?0,?size); } }?catch?(Exception?e)?{ System.out.println(?e.getMessage()); }?finally?{ //?關閉用到的資源 fos.close(); rs.close(); pstmt.close(); conn.close(); } } public?static?void?main(String[]?args)?{ try?{ GetImg?gi=new?GetImg(); gi.blobRead("c:/getimgs/1.jpg",?5); }?catch?(Exception?e)?{ System.out.println("[Main?func?error:?]"?+?e.getMessage()); } } } |
這里需要注意的是
is?=?rs.getBinaryStream("img"); |
img是數據庫中相應的列名,其實和rs.getString()方法差不多,只不過這個方法是讀取二進制流的
最后在帖兩個bs系統上用的文件給大家參考
通過Struts的action向數據庫寫入二進制圖片
? /* *?Generated?by?MyEclipse?Struts *?Template?path:?templates/Java/JavaClass.vtl */ package?com.lizhe.struts.action; import?java.io.File; import?java.io.FileInputStream; import?java.io.FileNotFoundException; import?java.io.IOException; import?java.io.InputStream; import?java.sql.Connection; import?java.sql.DriverManager; import?java.sql.PreparedStatement; import?java.sql.Statement; import?javax.Servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?org.apache.struts.action.Action; import?org.apache.struts.action.ActionForm; import?org.apache.struts.action.ActionForward; import?org.apache.struts.action.ActionMapping; import?org.apache.struts.upload.FormFile; import?com.lizhe.struts.form.UpimgForm; /** *?MyEclipse?Struts *?Creation?date:?05-18-2007 * *?XDoclet?definition: *?@struts.action?path="/upimg"?name="upimgForm"?input="/userhomepage.JSP" *?@struts.action-forward?name="userhome"?path="/userhomepage.jsp"?redirect="true"?contextRelative="true" */ public?class?UpimgAction?extends?Action?{ /* *?Generated?Methods */ /** *?Method?execute *?@param?mapping *?@param?form *?@param?request *?@param?response *?@return?ActionForward *?@throws?IOException *?@throws?FileNotFoundException */ public?ActionForward?execute(ActionMapping?mapping,?ActionForm?form, HttpServletRequest?request,?HttpServletResponse?response)?throws?FileNotFoundException,?IOException?{ UpimgForm?upimgForm?=?(UpimgForm)?form;//?TODO?Auto-generated?method?stub FormFile?file=upimgForm.getFile(); InputStream?is=file.getInputStream(); try?{ Class.forName("org.gjt.mm.MySQL.Driver").newInstance(); String?url?=?"JDBC:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312"; Connection?conn?=?DriverManager.getConnection(url); Statement?stmt?=?conn.createStatement(); //stmt.execute("insert ?into ?img?(id) ?values ?(5)"); stmt.close(); PreparedStatement?pstmt?=?null; String?sql?=?""; //File?file?=?new?File("c:log.jpg"); //InputStream?photoStream?=?new?FileInputStream(file); //sql?=?" ?UPDATE ?imgt ?SET ?img ?= ?? ?"; sql?=?"INSERT?INTO?img?(img)?VALUES?(?)"; pstmt?=?conn.prepareStatement(sql); pstmt.setBinaryStream(1,?is,?(int)?file.getFileSize()); pstmt.executeUpdate(); pstmt.close(); conn.close(); }?catch?(Exception?e)?{ e.printStackTrace(); } return?mapping.findForward("userhomepage"); } } |
和app的方式幾乎是一樣的
第二個文件是通過jsp將數據庫中的圖片顯示在頁面上
這個有些不同
?? <?%@ ?page ?contentType="text/html;charset=gb2312"%> <?%@ ?page ?import="java.sql.*" ?%> <?%@ ?page ?import="java.util.*"%> <?%@ ?page ?import="java.text.*"%> <?%@ ?page ?import="java.io.*"%> <?%@ ?page ?import="java.awt.*"%> <?html> <?body> <?% Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String?url="jdbc:mysql://localhost/img?user=root&password=root"; Connection ?con ?= ?DriverManager.getConnection(url); String ?sql ?= ?"select ?* ?from imgt?where?id=5"; Statement?stmt?=?con.createStatement(); ResultSet?rs?=?stmt.executeQuery(sql); if(rs.next())?{ InputStream?in?=?rs.getBinaryStream("img"); ServletOutputStream?op?=?response.getOutputStream(); int?len; byte[]?buf=new?byte[1024]; while((len=?in.read(buf))!=-1)?{ op.write(buf,?0,?len); } op.close(); in.close(); } rs.close(); stmt.close(); con.close(); %> <?/body> <?/html> |
轉載于:https://my.oschina.net/u/1044955/blog/277109
總結
以上是生活随笔為你收集整理的用Java或Jsp向数据库存取二进制图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 08 事件处理
- 下一篇: Java之基础(1) - 编程中“为了性