2015-04-01 52 views
1

我想要使用servlet從mysql數據庫中獲取並顯示保存爲blob的圖像。我寫了很多網站的代碼,但仍然不工作。我沒有收到任何類型的錯誤。它的表現是這樣無法使用servlet在數據庫中顯示JSP中的圖像

enter image description here

我創建使用

create table contacts(id int not null auto_increment, 
name varchar(40), 
second varchar(40), 
photo blob, 
primary key(id)); 

這是我的Servlet DisplayServlet.java

@WebServlet("/DisplayServlet") 
public class DisplayServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    Connection conn = null; 
    PreparedStatement stmt = null; 
    ResultSet rs = null; 
    public void init() throws ServletException { 

    } 

public DisplayServlet() { 
    super(); 
} 


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    doPost(request, response); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    String imageId = request.getParameter("id"); 
    System.out.println(imageId); 
    InputStream sImage; 



    // Check if ID is supplied to the request. 
    if (imageId == null) { 
     // Do your thing if the ID is not supplied to the request. 
     // Throw an exception, or send 404, or show default/warning image, or just ignore it. 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
     return; 
    } 

    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/projectbuy", "root","root"); 
     stmt = conn.prepareStatement("select photo from contacts where id=" + imageId); 
     rs = stmt.executeQuery(); 
     if(rs.next()){ 
      System.out.println("Inside RS"); 
      byte[] bytearray = new byte[1048576]; 
      int size=0; 
      sImage = rs.getBinaryStream(4); 
      response.reset(); 
      response.setContentType("image/jpeg"); 
      while((size = sImage.read(bytearray)) != -1){ 
       response.getOutputStream(). 
       write(bytearray,0,size); 
      } 
     } 

    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

}

這是我的jsp頁面,imagedemo表.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 

     <h1>Hello World!</h1> 


     <img src="DisplayServlet?id=1" height="150px" width="150px" alt="ProfilePic"> 

    </body> 
</html> 

最後,這是我的xml文件

<servlet-mapping> 
     <servlet-name>action</servlet-name> 
     <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

<servlet> 
    <servlet-name>DisplayServlet</servlet-name> 
    <servlet-class>DisplayServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>DisplayServlet</servlet-name> 
    <url-pattern>/DisplayServlet/*</url-pattern> 
</servlet-mapping> 

回答

1

你選擇只有一個列:

stmt = conn.prepareStatement("select photo from contacts where id=" + imageId); 

但後來試圖檢索4:

sImage = rs.getBinaryStream(4); 

你沒有flush()調用另一個寫循環。 此外,從池中使用連接,而不是直接從driverManager實例化,並在工作後關閉它是個好主意。

+0

::謝謝。它解決了我的問題:)非常感謝先生。 – 2015-04-01 19:52:48