BLOB 자료형을 이용하여 데이터베이스에 이미지 입/출
참고: http://micropilot.tistory.com/category/Java%20SE/JDBC%20Clob,%20Blob
<%@ page contentType="text/html;charset=KSC5601" import="java.sql.*" %>
<%
Connection conn = null;
PreparedStatement pstmt = null;
String jdbc_driver = "oracle.jdbc.OracleDriver";
String db_url = "jdbc:oracle:thin:@localhost:1521:ORA9I";
try{
Class.forName(jdbc_driver);
conn = DriverManager.getConnection(db_url,"cwisky","cwisky");
/*create table mytable (bfile BLOB, cfile CLOB) 으로 테이블을 생성한 후에....
* 바이너리 데이터 컬럼에 바이너리 데이터를 저장한다.
*/
pstmt = conn.prepareStatement("insert into mytable (bfile) values(?)");
byte[] buf = "some data".getBytes();
pstmt.setBytes(1, buf);
pstmt.executeUpdate();
pstmt.close();
/**/
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
// 바이너리 데이터를 저장하고 있는 컬럼으로부터 데이터를 가져온다
byte[] bytes = rs.getBytes("bfile");
out.print(new String(bytes));
}
rs.close();
stmt.close();
conn.close();
}
catch(Exception e) {
out.println(e);
}
%>
데이터베이스에 이미지를 저장하고 저장된 이미지를 다시 가져와서 브라우저에 출력하는 서블릿 예제
DB_Image_Servlet.java
package blob;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.imageio.*;
/** 이 서블릿 클래스는 반드시 JSP와 함께 테스트해야 한다.
* 여기서는 데이터베이스에 저장된 BLOB컬럼의 이미지를 가져와서 브라우저에 출력하고 있다.
* 이 클래스를 JSP측에서 사용할 때, <img scr="이 서블릿의 경로">와 같이 해 주면 된다*/
public class DB_Image_Viewer extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/png");
Connection conn = null;
PreparedStatement pstmt = null;
String jdbc_driver = "oracle.jdbc.OracleDriver";
String db_url = "jdbc:oracle:thin:@localhost:1521:ORCL";
try{
Class.forName(jdbc_driver);
conn = DriverManager.getConnection(db_url,"scott","koreait");
/*create table mytable (bfile BLOB, cfile CLOB) 으로 테이블을 생성한 후에....
* 바이너리 데이터 컬럼에 바이너리 데이터를 저장한다.
*/
pstmt = conn.prepareStatement("insert into mytable (bfile) values(?)");
// 웹상의 이미지 경로를 실제 파일시스템상의 경로로 변환한다.
String path = getServletContext().getRealPath("/images/google_logo.png");
// byte배열로 변환해야만 blob형의 컬럼에 저장할 수 있다.
ByteArrayOutputStream bout = new ByteArrayOutputStream();
FileInputStream fin = new FileInputStream(path);
byte[] buf = new byte[1024];
int read = 0;
while((read=fin.read(buf,0,buf.length))!=-1){
bout.write(buf,0,read);
}
fin.close();
// byte배열이 완성되었다
byte[] imageData = bout.toByteArray();
// byte배열을 DB에 저장한다
pstmt.setBytes(1, imageData);
pstmt.executeUpdate();
pstmt.close();
// 이미지를 DB에 저장하는 예 끝.......................................................//
// DB에 저장된 이미지를 가져와서 웹브라우저에 출력하는 예
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");
if (rs.next()) {
// 바이너리 데이터를 저장하고 있는 컬럼으로부터 데이터를 가져온다
InputStream in = rs.getBinaryStream("bfile");
// BufferedImage를 생성하면 ImageIO를 통해 브라우저에 출력하기가 쉽다.
BufferedImage bimg = ImageIO.read(in);
in.close();
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(bimg, "png", sos);
}
rs.close();
stmt.close();
conn.close();
}
catch(Exception e) {
System.err.println(e);
}
}
}
위에 정의된 서블릿을 이용하여 이미지를 브라우저에 출력하는 예
db_image.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<html>
<head>
<title>데이터베이스 이미지 출력 예제</title>
</head>
<body><br><br><center>
<h3>Servlet을 이용하여 Database에 저장된 BLOB 데이터를 브라우저에 출력하는 예</h3>
<img src="../DB_Image_Viewer">
</center>
</body>
</html>