2011-01-31 4 views
0

이 방금 아래 그림과 같이 OutputStream에 이미지 바이너리 데이터를 쓸 수, 코드가서블릿에서 데이터베이스의 이미지를 표시하는 방법은 무엇입니까?

import java.io.IOException; 
import java.io.InputStream; 
import java.sql.Blob; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class DisplayBlobServlet extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, 
      ServletException { 
     String photoid = request.getParameter("txtid"); 
     Blob photo = null; 
     Connection conn = null; 
     Statement stmt = null; 
     ResultSet rs = null; 
     String query = "select oimage from orderform where cuname = '" + photoid + "'"; 
     ServletOutputStream out = response.getOutputStream(); 

     try { 
      conn = getMySqlConnection(); 
     } catch (Exception e) { 
      response.setContentType("text/html"); 
      out.println("<html><head><title>Person Photo</title></head>"); 
      out.println("<body><h1>Database Connection Problem.</h1></body></html>"); 
      return; 
     } 

     try { 
      stmt = conn.createStatement(); 
      rs = stmt.executeQuery(query); 
      if (rs.next()) { 
       photo = rs.getBlob(9); 

      } else { 
       response.setContentType("text/html"); 
       out.println("<html><head><title>Person Photo</title></head>"); 
       out.println("<body><h1>No photo found for id= 001 </h1></body></html>"); 
       return; 
      } 

      response.setContentType("image/gif"); 
      InputStream in = photo.getBinaryStream(); 
      int length = (int) photo.length(); 

      int bufferSize = 1024; 
      byte[] buffer = new byte[bufferSize]; 

      while ((length = in.read(buffer)) != -1) { 
       System.out.println("writing " + length + " bytes"); 
       out.write(buffer, 0, length); 
      } 

      in.close(); 
      out.flush(); 
     } catch (SQLException e) { 
      response.setContentType("text/html"); 
      out.println("<html><head><title>Error: Person Photo</title></head>"); 
      out.println("<body><h1>Error=" + e.getMessage() + "</h1></body></html>"); 
      return; 
     } finally { 
      try { 
       rs.close(); 
       stmt.close(); 
       conn.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /*private static Connection getHSQLConnection() throws Exception { 
    Class.forName("jdbc.jdbcDriver"); 
    System.out.println("Driver Loaded."); 
    String url = "jdbc:hsqldb:data/tutorial"; 
    return DriverManager.getConnection(url, "sa", ""); 
    }*/ 
    public static Connection getMySqlConnection() throws Exception { 
     String driver = "com.jdbc.mysql.Driver"; 
     String url = "jdbc:mysql://localhost/studio"; 
     String username = "root"; 
     String password = " "; 

     Class.forName(driver); 
     Connection conn = DriverManager.getConnection(url, username, password); 
     return conn; 
    } 

    /*public static Connection getOracleConnection() throws Exception { 
    String driver = "oracle.jdbc.driver.OracleDriver"; 
    String url = "jdbc:oracle:thin:@localhost:1521:databaseName"; 
    String username = "username"; 
    String password = "password"; 

    Class.forName(driver); // load Oracle driver 
    Connection conn = DriverManager.getConnection(url, username, password); 
    return conn; 
    }*/ 
} 
+1

당신은 우리에게 코드의 조각을주고 우리에게 적용되지 않습니다, "이 코드에 오류가 없습니다." 어떤 종류의 질문입니까? – skaffman

+0

오류가없는 경우 문제가 무엇입니까 (사용에 대한 세부 정보를 제공합니다 - "작동하지 않는다"는 말을하지 마십시오)? – nos

+0

오 오 야! 그가 왔을 때, 그는 올랐고, 결코 결코 신경 쓰지 않았다. : P – KNU

답변

0

글쎄, 당신은 Blob.inputStream을 사용할 필요가없는 오류가없는 것입니다;

out.write(photo,0,photo.length); 

대신;

response.setContentType("image/jpg") 

그렇지 않으면 브라우저가 텍스트로 바이트 스트림을 표시하려고 시도합니다 :

InputStream in = photo.getBinaryStream();    
int length = (int) photo.length();    
int bufferSize = 1024;    
byte[] buffer = new byte[bufferSize];    
while ((length = in.read(buffer)) != -1) {     
System.out.println("writing " + length + " bytes");     
out.write(buffer, 0, length);    
}    
in.close(); 
4

당신은 내용이 이미지는 것을 사용자의 브라우저에 알려야합니다. 하지만 "오류"를 지정하지 않으므로이 시점에서 더 이상 도움을 줄 수 없습니다.

0

오류가 out.write(photo,0,photo.length);

의 유형 PrintWriter의 방법 write(char[], int, int) 인 인수 (Blob, int, long)

관련 문제