来自Servlets的jsp内部没有提供图像

时间:2011-04-22 01:59:56

标签: java jsp servlets stream blob

我有一个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;
                }
    }
}

如果有人可以就此提出任何建议,我将非常感谢。

3 个答案:

答案 0 :(得分:0)

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

为了使这项工作,你必须在服务页面(可能是base64)时对二进制数据进行某种显式文本编码,然后在URL之后将servlet参数解码回二进制图像数据。回来了。

答案 1 :(得分:0)

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

您似乎正试图以错误的方式解决问题。当您第一次创建HTML表时,将图像存储在第一个查询的“bean”中除非您缓存数据,否则不会为您提供任何内容,而后续的displayThumbnail请求会从缓存中检索图像,从而避免数据库查询。

如果您不想搞砸缓存,那么就不需要将图像存储在初始bean中,因为它不会给您任何东西,只需执行类似于您的第二个processRequest()代码段来直接获取图像。浏览器要求它。

答案 2 :(得分:0)

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