为了使用JSP灵活,需要把各种文件储存到数据库中,然后需要的时候把它读取出来显示到客户端。这些文件包括音乐,图片,文本等,人们统称为二进制文件。
首先,二进制文件储存到数据库的过程:打开文件,将内容读到缓冲区,然后直接联线创建jdbc语句对象,使用该缓冲区的数据,并执行更新,就完成了储存。
例子:
首先在mysql中创建一个表 picture_db
create table picture_db( file_name varchar(255) not null, content longblob, primary key (file_name));
|
接下来就是用java写储存文件的代码:
假设要储存的图片名称是:01.jpg (放在同一个目录下)
import java.sql.*; import java.io.*; import java.nio.*; public class UploadImage { protected Connection dbConnection; protected String driverName = "com.mysql.jdbc.Driver"; protected String dbURL = "jdbc:mysql://localhost:3306/sample_db"; protected String userID = "root"; protected String passwd = "yourpassword";
public boolean storeImage(String sqlstr,File file){ try{ FileInputStream fin = new FileInputStream(file); ByteBuffer nbf = ByteBuffer.allocate((int)file.length()); byte[] array = new byte[1024]; int offset =0,length=0; while((length=fin.read(array))>0){ if(length!=1024) nbf.put(array,0,length); else nbf.put(array); offset+=length;
} fin.close(); byte[] content = nbf.array(); return setImage(sqlstr,content);
}catch(FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } return false;
}
private boolean setImage(String sqlstr,byte[]in){ boolean flag = false; if(sqlstr==null) sqlstr="select * from picture_db"; try{ Class.forName(driverName); dbConnection = DriverManager.getConnection(dbURL,userID,passwd); Statement stmt = dbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(sqlstr); if(rs.next()){ rs.updateBytes(2,in); rs.updateRow(); } else{ rs.moveToInsertRow(); rs.updateString(1,"01"); rs.updateBytes(2,in); rs.insertRow(); } rs.close(); flag=true;
}catch(Exception e){ e.printStackTrace(); } return flag;
}
public static void main(String[] args){ UploadImage upload = new UploadImage(); try{ File file = new File("01.jpg"); if(upload.storeImage(null, file)) System.out.print("ture"); else System.out.print("False");
}catch(Exception e){ e.printStackTrace(); } } }
|
如果执行成功的话,系统打印“true" 否则“false".
最后就是将图片度取出来:与储存的过程相反,它是县建立连接,创建数据库查询的jdbc对象,使用该语句来返回二进制结果,保存到文件当中。
showImage.jsp
<%@ page contentType = "image/jpeg;charset=GB2312"%> <%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%> <%@ page import="com.sun.image.codec.jpeg.*"%> <%@ page import="javax.imageio.*"%> <%@ page import="java.awt.image.*"%>
<html> <head> <meta http-equiv="Content-Type" content="image/jpeg;charset=GB2312"> <title>showDBImage</title> </head> <body> <% String showImage ="select * from picture_db where file_name ='01'"; Connection conn = null; BufferedInputStream inputImage = null;
String driverName = "com.mysql.jdbc.Driver"; String dbURL = "jdbc:mysql://localhost:3306/sample_db"; String userID = "root"; String passwd = "yourpassword";
try{ Class.forName(driverName).newInstance(); conn = DriverManager.getConnection(dbURL,userID,passwd);
Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(showImage); while(rs.next()){ Blob blob = (Blob)rs.getBlob("content"); inputImage = new BufferedInputStream(blob.getBinaryStream()); }
BufferedImage image = null; image = ImageIO.read(inputImage); ServletOutputStream sos = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos); encoder.encode(image); inputImage.close();
}catch(SQLException e) { e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } %> </body> </html>
|
不足之处在于:每次只能储存一张图片,好像还不能储存两张图片,它总是覆盖掉前面的那一张即使图片的文字不一样。如果感兴趣的朋友,帮我测试以下。谢谢。还有,如果我想储存多张图片,该如何呢?