如何在JSP页中检索和显示数据库中的图像?
如何在 JSP 页中检索和显示数据库中的图像?
让我们在步骤中看看应该发生什么:
<img>
src
src
http://
file://
http://example.com/context/images/foo.png
http://example.com/context/images?id=1
/images/*
ResultSet#getBytes()
和ResultSet#getBinaryStream(),
JPA API为此提供了@Lob
。byte[]
InputStream
byte[]
InputStream
OutputStream
Content-Type
响应标头。您可以通过ServletContext#getMimeType()
获得正确的一个,基于图像文件扩展名,您可以通过在 中扩展和/或覆盖。<mime-mapping>
web.xml
应该就是这样。它几乎自己编写代码。让我们从HTML(在JSP中)开始:
<img src="${pageContext.request.contextPath}/images/foo.png">
<img src="${pageContext.request.contextPath}/images/bar.png">
<img src="${pageContext.request.contextPath}/images/baz.png">
如有必要,您还可以在使用 JSTL 迭代时使用 EL 进行动态设置:src
<c:forEach items="${imagenames}" var="imagename">
<img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>
然后定义/创建一个 servlet,该 servlet 侦听 URL 模式上的 GET 请求,下面的示例使用普通的 vanilla JDBC 进行作业:/images/*
@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {
// content=blob, name=varchar(255) UNIQUE.
private static final String SQL_FIND = "SELECT content FROM Image WHERE name = ?";
@Resource(name="jdbc/yourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml.
private DataSource dataSource;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String imageName = request.getPathInfo().substring(1); // Returns "foo.png".
try (Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_FIND)) {
statement.setString(1, imageName);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
byte[] content = resultSet.getBytes("content");
response.setContentType(getServletContext().getMimeType(imageName));
response.setContentLength(content.length);
response.getOutputStream().write(content);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
}
}
} catch (SQLException e) {
throw new ServletException("Something failed at SQL/DB level.", e);
}
}
}
就是这样。如果您担心 HEAD 和缓存标头并正确响应这些请求,请将此抽象模板用于静态资源 servlet。
我建议你把这个问题作为两个问题来解决这个问题。有几个问题和答案与两者有关。
如何从 MySQL 加载 blob
例如,请参阅 检索存储为 blob 的图像
如何动态显示图像
例如,请参阅动态显示缩略图