【问题标题】:How to display an image from a database in a JSP using a java servlet?如何使用 java servlet 在 JSP 中显示数据库中的图像?
【发布时间】:2016-05-02 21:42:23
【问题描述】:

这是我当前的 servlet 代码。这是我将从数据库中获取图像的地方。

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;
}

我从link 获得了 servlet 代码,但似乎在设置 init servlet 响应部分时出现错误。

很抱歉提出这个问题。这是我第一次尝试从数据库中获取图像 blob 并通过 DAO 和 servlet 获取它,到目前为止,我只看到了在 jsp 中包含 java 代码的代码。

感谢您的帮助。谢谢!

【问题讨论】:

  • “我设置 init servlet 响应部分时似乎出错了” - 你得到什么错误?
  • servlet 找不到getContentType()getContent().lengthgetContent() 方法
  • 你问了一个错误的问题:链接中的 BalusC 的代码只是说明了如何从 Servlet 发送图像如果你的 DAO 为你提供了图像。他甚至在评论中说 这是一个虚构的 DAO。只需使用您自己的 DAO 东西 :)。您的请求SELECT receipt_filepath ... 让您认为您的数据库仅存储图像的路径。如果这是真的,你应该首先确保你真的得到了图像位,如果你不能,就问另一个问题(包括你的尝试)。

标签: java jsp servlets dao


【解决方案1】:

尝试替换

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);

【讨论】:

    【解决方案2】:

    找不到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);
    

    【讨论】:

    • 我可以将 ContentType 设置为 response.setContentType("image/*"); 吗?
    • 这取决于浏览器对通配符图像内容类型的支持。它可以在服务器端完美运行,但恐怕我不知道浏览器支持它的程度。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2011-09-13
    相关资源
    最近更新 更多