【问题标题】:Image Servlet not working图像 Servlet 不工作
【发布时间】:2013-01-17 15:56:59
【问题描述】:

嘿,任何人都可以帮助我使用我的 servlet,该 servlet 旨在在从数据库中获取图像后将图像显示到我的 jsp 页面。我下面的图像 servlet 似乎根本没有在我的浏览器中显示图像,只有一个损坏的图像图标:

@WebServlet(name = "ImageServlet", urlPatterns = {"/Image"})
public class ImageServlet extends HttpServlet {

private DatabaseConnector dataManager;
BufferedInputStream input = null;
BufferedOutputStream output = null;

@Override
public void init() {
    dataManager = new DatabaseConnector();
}

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Prepare.
    String name = request.getPathInfo().substring(1); // Returns "foo.gif". You may want to do nullchecks here to avoid NPE's.
    ResultSet resultSet = null;

    try {
        // Query DB.
        resultSet = dataManager.getPhotos(1);

        if (resultSet.next()) {
            // Image found, prepare response and send it.
            response.setContentType(resultSet.getString("contentType"));
            response.setContentLength(resultSet.getInt("contentLength"));
            response.setHeader("Content-Disposition", "inline;filename=\"" + name + "\"");
            input = null;
            output = null;

            try {
                input = new BufferedInputStream(resultSet.getBinaryStream("content"));
                output = new BufferedOutputStream(response.getOutputStream());
                byte[] buffer = new byte[1024];

                for (int length; (length = input.read(buffer)) > -1;) {
                    output.write(buffer, 0, length);
                }
            } finally {
                if (output != null) {
                    try {
                        output.close();
                    } catch (IOException logOrIgnore) {
                    }
                }
                if (input != null) {
                    try {
                        input.close();
                    } catch (IOException logOrIgnore) {
                    }
                }
            }
        } else {
            // No image found, send HTTP 404.
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalArgumentException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException e) {
        throw new ServletException("Something failed at SQL/DB level.", e);
    } finally {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException logOrIgnore) {
            }
        }
    }
}
}

我的jsp页面中的图片是这样的:

<img src="/Image/<%= h.getHomeID() %>">

最后我的结果集来自的数据库连接器类是:

public ResultSet getPhotos(String photoID) throws
        IllegalArgumentException, SQLException, ClassNotFoundException {

    createConnection();


    ResultSet rs = null;
    PreparedStatement preparedStatement = null;

    String strQuery = "SELECT home_photo.photo "
            + "FROM home_photo "
            + "WHERE home_photo.home_id = ?";

    try {
        preparedStatement = conn.prepareStatement(strQuery);
        preparedStatement.setString(1, photoID);
        rs = preparedStatement.executeQuery();

    } catch (SQLException e) {
        throw new SQLException(e);
    } finally {
        closeConnection();
        return rs;
    }
}

我的 web.xml 也是这样的:

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>DB.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/Image/*</url-pattern>
</servlet-mapping>

如果有人知道为什么图片没有显示,我将不胜感激

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    有 2 个潜在问题。

    1. 图片网址错误。查看您的网络浏览器开发工具集的 HTTP 流量监视器(在 Chrome/IE9/Firebug 中按 F12 并查看 Net(work) 部分)。 HTTP 响应代码必须是 2nn/3nn 而不是 404。adarshr 的回答涵盖了这一点。

      <img src="${pageContext.request.contextPath}/Image/<%= h.getHomeID() %>">
      

      另见:


    2. 您在返回结果集之前关闭了数据库连接,但之后仍尝试访问结果集。这会抛出一个SQLException,它应该显示为 HTTP 500 错误页面。这在 HTTP 流量监视器中也应该是可见的,甚至当您直接在浏览器的地址栏中指定图像的 URL 时也是如此。

      您需要重写不返回ResultSet 的代码,而只是将图像的内容返回为byte[],或者将DB 作业移动到servlet 内部。在任何情况下,您都不应该创建接受或返回 ResultSet 实例的公共方法。

      另见:

    【讨论】:

      【解决方案2】:

      看起来图像 servlet 的 URL 错误。如果您以/ 开头,它会将您带到上下文的根目录。

      <img src="${pageContext.request.contextPath}/Image/<%= h.getHomeID() %>">
      

      【讨论】:

      • 您好,感谢您的回复。我尝试用我的替换它,但它似乎仍然显示损坏的图像图标。
      猜你喜欢
      • 2018-02-11
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多