为了使用JSP灵活 需要把各种文件储存在数据库中 然后需要的时候将它读取出来显示到客户端 这些文件包括文本 图片 音乐等 人们统称为二进制文件 :: 二进制文件储存在数据库中的过程是 打开文件 将内容读到缓存区 然后直接连接创建JDBC语句对象 使用该缓冲区的数据 并执行更新 就完成了储存
1 在mysql中创建一个表picture_db
- create table picture_db(
- file_name varchar(255) not null,
- content longblob,
- primary key (file_name));
2 java 写储存文件的代码
- 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
3 就是将图片读取出来 与储存的过程相反 先建立连接 创建数据库查询JDBC对象 使用该语句来返回二进制结果 保存到文件中
- <%@ 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>
阅读(9606) | 评论(1) | 转发(3) |