图像未在 Servlet 的 jsp 内提供

发布于 2024-11-02 12:44:44 字数 2734 浏览 1 评论 0原文

我有一个jsp,其中对于表的每一行,我需要显示数据库中存在的图像。我从数据库中检索所有表行数据(包括 Blob 形式的图像)并将其存储在 bean 中。图像作为字节数组存储在 bean 中,如下所示:

photo = rs.getBlob("PHOTO");
photoByteArray = photo.getBytes(1, (int)photo.length());

在 jsp 中循环 bean 列表时,src 属性指向如下所示的 servlet:

<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}">

它提供如下所示的图像,但在调试时它们不会显示字节数组似乎确实有数据。

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("image/jpeg");
    OutputStream o = response.getOutputStream();
    String photoDataStr = request.getParameter("photoData");
    byte[] photoData = null;
    if(photoDataStr != null) {
        photoData = photoDataStr.getBytes();
    }
    o.write(photoData);
    o.close();
}

但是图像没有显示。现在,如果我查询数据库中的每个单独图像,如下所示,在这种情况下图像确实显示得很好。

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Connection conn = null;
            try {
        if(conn == null) {
            conn = open();
        }
        pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?");
        String id = request.getParameter("id");
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if (rs.next()) {
            Blob b = rs.getBlob("photo");
            response.setContentType("image/jpeg");
            response.setContentLength((int) b.length());
            InputStream is = b.getBinaryStream();
            OutputStream os = response.getOutputStream();
            byte buf[] = new byte[(int) b.length()];
            is.read(buf);
            os.write(buf);
            os.close();
            is.close();
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    } finally {
         if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt = null;
        }
        //check if it's the end of the loop
            if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    conn = null;
                }
    }
}

如果有人可以提供任何类似的建议,我将不胜感激。

I have a jsp wherein for each row of the table i need to display the image present in the database. I retrieve all the table row data from database including image as Blob and store it in a bean. The image is stored in the bean as byte array like this:

photo = rs.getBlob("PHOTO");
photoByteArray = photo.getBytes(1, (int)photo.length());

While looping over the list of beans in jsp, the src attribute points to a servlet like this:

<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}">

which serves the image like shown below but they don't show up however upon debugging the byte array do seem to have data.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("image/jpeg");
    OutputStream o = response.getOutputStream();
    String photoDataStr = request.getParameter("photoData");
    byte[] photoData = null;
    if(photoDataStr != null) {
        photoData = photoDataStr.getBytes();
    }
    o.write(photoData);
    o.close();
}

However the image doesn't show up. Now, if i query the database for each individual image as shown below, the images do show up fine in that case.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Connection conn = null;
            try {
        if(conn == null) {
            conn = open();
        }
        pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?");
        String id = request.getParameter("id");
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if (rs.next()) {
            Blob b = rs.getBlob("photo");
            response.setContentType("image/jpeg");
            response.setContentLength((int) b.length());
            InputStream is = b.getBinaryStream();
            OutputStream os = response.getOutputStream();
            byte buf[] = new byte[(int) b.length()];
            is.read(buf);
            os.write(buf);
            os.close();
            is.close();
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    } finally {
         if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt = null;
        }
        //check if it's the end of the loop
            if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    conn = null;
                }
    }
}

I would highly appreciate if anyone can provide any recommendations around the same.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

提赋 2024-11-09 12:44:44

您假设您可以将随机二进制数据放入 HTML 文件中,并且它将被正确解析并完好无损地发送回您的服务器。这是一个糟糕的假设!如果不出意外的话,与引号字符的 ASCII 对应的字节将会引起问题,对吧?更不用说编码问题了,而且 URL 的参数必须进行 urlencode 编码。这只是注定要失败的。

为了实现这项工作,您在提供页面时必须对二进制数据进行某种显式文本编码(可能是 base64),然后在 URL 回发后将 servlet 参数解码回二进制图像数据。

You're assuming that you can put random binary data into an HTML file, and it will be parsed correctly, and sent back to your server intact. This is a bad assumption! If nothing else, the byte that corresponds to the ASCII for the quote character is going to cause problems, right? Not to mention encoding issues, and the fact that the parameters to a URL must be urlencoded. This is just doomed to fail.

To make this work, you'd have to have some kind of explicit text encoding of the binary data when you serve the page (base64, maybe), and then decode the servlet parameter back to binary image data after the URL is posted back.

甜柠檬 2024-11-09 12:44:44

您的第一个 processRequest() 代码片段仅发回 photoData 请求参数的字节表示形式,而不是该参数标识的照片数据。看起来像是您的代码中的错误。

看来您正试图以错误的方式解决问题。当您第一次创建 HTML 表时,将第一个查询中的图像存储在“bean”中不会给您带来任何好处,除非您缓存数据,并且后续的 displayThumbnail 请求从缓存中检索图像,从而避免数据库查询。

如果您不想搞乱缓存,则无需将图像存储在初始 bean 中,因为它不会为您提供任何内容,只需执行第二个 processRequest() 代码片段之类的操作即可在浏览器要求时直接获取图像它。

Your first processRequest() snippet is only sending back the byte representation of the photoData request parameter and not the photo data identified by the parameter. Looks like a bug in your code.

It seems you are trying to solve your problem in the wrong manner. When you first create the HTML table, storing the image in your "bean" from your first query gives you nothing unless you cache the data, and the subseqent displayThumbnail request retrieves the image from the cache, avoiding the database query.

If you do not want to mess with caching, then there is no need to store the image in your initial bean since it gives you nothing, and just do something like your second processRequest() snippet to fetch the image directly when the browser asks for it.

蓝梦月影 2024-11-09 12:44:44

您的 ${part.photoData} 表达式必须返回一些 ID。在 processRequest() 方法中,您必须获取该 ID 值(通过使用 request.getParameter("photoData")),并通过该值从数据库(或者更好地从缓存或文件系统)检索图像,并将二进制数据发送到 Web 客户端。

Your ${part.photoData} expression must return some ID. In the processRequest() method you must get that ID value (by using request.getParameter("photoData")) and by that value retrieve image from database (or better from cache or from file system) and send the binary data to web client.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文