2016-01-26 117 views
1

這是我目前的servlet代碼。這是我從數據庫中獲取圖像的地方。如何使用java servlet在JSP中顯示數據庫中的圖像?

newServlet.java

package LAWS_SERVLETS; 

import LAWS_DAOS.LReceiptsDAO; 
import LAWS_ENTITIES.Lawyer_Receipt; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* 
* @author Meryl 
*/ 
@WebServlet(name = "newServlet", urlPatterns = {"/newServlet"}) 
public class newServlet extends HttpServlet { 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 

    } 

@Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
     LReceiptsDAO lrDAO = new LReceiptsDAO(); 
     int imageId = Integer.parseInt(request.getParameter("id")); 

     // Check if ID is supplied to the request. 
     if (imageId == 0) { 

      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 


     byte[] image = lrDAO.getReceiptFile(imageId); 

     // Check if image is actually retrieved from database. 
     if (image == null) { 
      // Do your thing if the image does not exist in database. 
      // Throw an exception, or send 404, or show default/warning image, or just ignore it. 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 

     // Init servlet response. 
     response.reset(); 
     response.setContentType(image.getContentType()); 
     response.setContentLength(image.getContent().length); 

     // Write image content to response. 
     response.getOutputStream().write(image.getContent()); 

    } 


} 

LReceiptsDAO

public byte[] getReceiptFile(int id){ 
    byte[] l = null; 

    try { 

     DBConnectionFactory myFactory = DBConnectionFactory.getInstance(); 
     Connection conn = myFactory.getConnection(); 
     PreparedStatement pstmt = conn.prepareStatement("SELECT receipt_filepath FROM lawyer_receipts" 
       + "where lawyerreceipt_id = ? "); 

     pstmt.setInt(1, id); 
     ResultSet rs = pstmt.executeQuery(); 
     while(rs.next()){ 

      l = rs.getBytes("receipt_filepath");    
     } 
     conn.close(); 
     return l; 
    } catch (SQLException ex) { 
     Logger.getLogger(LReceiptsDAO.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return null; 
} 

我得到了servlet代碼從這個link但似乎我得到一個錯誤,當我設置初始化servlet響應部分。

我很抱歉問這個問題。這是我第一次嘗試從數據庫中獲取圖像blob,並通過DAO和servlet獲取圖像,到目前爲止,我只看到包含java代碼的代碼。

我很感激幫助。謝謝!

+1

「看來,我得到一個錯誤,當我設置初始化servlet響應部分」 - 什麼樣的錯誤你得到? – megaflop

+0

該servlet無法找到'getContentType()','getContent().length'和'getContent()'方法 – user3418987

+0

你問一個錯誤的問題:BalusC的鏈接代碼只是說如何從Servlet *只要你的DAO給你一張圖片*。他甚至在評論中說*這是一個虛構的DAO。只需使用你自己的DAO的東西:)*。您的請求'SELECT receipt_filepath ...'讓我們認爲您的數據庫只存儲圖像的路徑。如果那是真的,你應該首先確保你真的獲得了圖像位,並且如果你不能,請提出另一個問題(包括你的嘗試)。 –

回答

0

嘗試更換

response.setContentType(image.getContentType()); 
response.setContentLength(image.getContent().length); 
response.getOutputStream().write(image.getContent()); 

response.setContentType("image/*"); 
response.setContentLength(image.length); 
response.getOutputStream().write(image); 
0

未找到getContentType()getContent()方法的原因是因爲它們不存在。變量image的類型是byte[] - 原始字節數組 - 而數組沒有這些方法。該代碼不應該實際編譯。

您得到該代碼的鏈接的類型爲image變量爲com.example.model.Image(在該示例中已定義的類,並且具有這些方法)而不是byte[]

順便說一句,在你的例子中的代碼是選擇一個名爲receipt_filepath的字段,這表明該字段存儲磁盤上的圖像的路徑,而不是blob。如果是這樣,您應該解決該路徑並從磁盤讀取文件(如鏈接到的示例中所做的那樣)。

如果它是一個blob,那麼你真的應該將圖像的內容類型存儲在數據庫中。在這種情況下,你可以做這樣的事情:

PreparedStatement pstmt = conn.prepareStatement("SELECT image_blob_field_name, image_content_type_field_name FROM lawyer_receipts" 
      + "where lawyerreceipt_id = ? "); 
... 
byte[] image = rs.getBytes(1); 
String contentType = rs.getString(2); 
... 

再後來:

response.setContentType(contentType); 
response.setContentLength(image.length); 
response.getOutputStream().write(image); 
+0

我可以將ContentType設置爲'response.setContentType(「image/*」);'而不是? – user3418987

+0

這取決於瀏覽器對通配圖像內容類型的支持。它將在服務器端完美工作,但恐怕我不知道瀏覽器支持它的程度。 – megaflop

相關問題