1、引言
資料庫應用程式,特別是基於WEB的資料庫應用程式,常會涉及到圖片資訊的儲存和顯示。通常我們使用的方法是將所要顯示的圖片存在特定的目錄下,在資料庫中儲存相應的圖片的名稱,在JSP中建立相應的資料來源,利用資料庫訪問技術處理圖片資訊。但是,如果我們想動態顯示圖片,上述方法就不能滿足需要了。我們必須把圖片存入資料庫,然後通過編程動態地顯示我們需要的圖片。實際操作中,可以利用JSP的編程模式來實現圖片的資料庫儲存和顯示。
2、 建立後台資料庫
假定處理的是圖片新聞,那麼我們可以建立相應的資料庫如下:
表picturenews中,欄位id作為標識,每儲存一行資料,自動增加1。欄位image
用於儲存圖片資訊,其資料類型為“image”。
3、向資料庫儲存二進位圖片
啟動Dreamweaver MX後,建立一個JSP檔案。其代碼如下所示。
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>無標題文檔</title>
</head>
<body>
<form action="testimage.jsp" method="post" name="form1">
<p align="center">
新聞標題
<input name="content" type="text" id="content">
</p>
<p> </p>
<p align="center">新聞圖片
<input type="file" name="image">
</p>
<p align="center">新聞內容
<textarea name="txtmail" cols="90" rows="15" id="txtmail"></textarea>
</p>
<p align="center">
<input type="submit" name="Submit" value="提交">
</p>
</form>
</body>
</html>
將此檔案儲存為InputImage.jsp檔案,其中testimage.jsp檔案是用來將圖片資料存入資料庫的,具體代碼如下所示:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import="java.io.*"%>
<html>
<body>
<%try{Class.forName("org.gjt.mm.mysql.Driver");
//載入驅動程式類
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/test","root","");
//建立資料庫聯機,其中test為資料庫名,root為串連資料庫的帳號,密碼為空白。
String content=request.getParameter("content");
content=new String(content.getBytes("8859_1"),"gb2312");
String filename=request.getParameter("image");
filename=new String(filename.getBytes("8859_1"),"gb2312");
String detail=request.getParameter("txtmail");
detail=new String(detail.getBytes("8859_1"),"gb2312");
//獲得所要顯示圖片的標題、儲存路徑、內容,並進行中文編碼
FileInputStream str=new FileInputStream(filename);
String sql="insert into picturenews(content,image,detail) values(?,?,?)";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1,content);
pstmt.setBinaryStream(2,str,str.available());
pstmt.setString(3,detail);
pstmt.execute();
//將資料存入資料庫
out.println("Success,You Have Insert an Image Successfully");
}
catch(Exception ex){out.println("Failure");}
%>
</body>
</html>
4、網頁中動態顯示圖片
接下來我們要編程從資料庫中取出圖片,其代碼如下所示。
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import="java.io.*"%>
<html>
<body>
<%
Class.forName("org.gjt.mm.mysql.Driver");
//載入驅動程式類
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/test","root","");
Statement stmt=con.createStatement();
ResultSet rs=null;
//建立ResultSet(結果集)對象
int id= Integer.parseInt(request.getParameter("id"));
//獲得所要顯示圖片的編號id,並轉換為整型
String sql = "select image from picturenews WHERE id="+id+"";
//要執行查詢的SQL語句
rs=stmt.executeQuery(sql);
while(rs.next()) {
ServletOutputStream sout = response.getOutputStream();
//圖片輸出的輸出資料流
InputStream in = rs.getBinaryStream(1);
byte b[] = new byte[0x7a120];
for(int i = in.read(b); i != -1;)
{
sout.write(b);
//將緩衝區的輸入輸出到頁面
in.read(b);
}
sout.flush();
//輸入完畢,清除緩衝
sout.close();
}
%>
</body>
</html>
將此檔案儲存為testimageout.jsp檔案。下一步要做的工作就是使用HTML標記:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>動態顯示資料庫圖片</title>
</head>
<body>
<%
Class.forName("org.gjt.mm.mysql.Driver");
//載入驅動程式類
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/test","root","");
Statement stmt=con.createStatement();
String sql=new String();
sql= "select * from picturenews";
ResultSet rs=stmt.executeQuery(sql);
rs.last();
//將指標移至最後一條記錄
%>
<table>
<tr><td><IMG height=99 src="testimageout.jsp?id=1" width=136></td>
//取出第一個圖片
<td><IMG height=99 src="testimageout.jsp?id=<%=rs.getInt("id")%>" width=136></td>
//取出最後一個圖片
</tr></table>
</body>
</html>
該檔案被儲存為getImage.jsp
以上WEB應用程式在Windows 2000 Professional/MySQL4.0.18/ Apache Tomcat 5.5/JDK 1.5 JAVA環境下調試通過