3

我使用一个 servlet 来获取从我的项目中保存的图像。我的 servlet 中的代码是:

String file = request.getParameter("file"); 
BufferedInputStream in = new BufferedInputStream(new FileInputStream(directory + file));
// Get image contents.
byte[] bytes = new byte[in.available()];
in.read(bytes);
in.close();
// Write image contents to response.
response.getOutputStream().write(bytes);

HTML 图像标签如下所示:

<img src="/images/?file=example.jpg" />

万事皆安。但现在我想在 URI 中有图像文件名,而不是像这样的请求参数:

<img src="/images/example.jpg" />

我怎样才能实现它?

4

1 回答 1

4

将 servlet 映射到前缀 URL 模式/images/*而不是明显精确的 URL 模式 /images。然后,您可以完全指定 URL,并通过HttpServletRequest#getPathInfo().

开球示例:

@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getPathInfo().substring(1);
        File file = new File(directory, filename);
        response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

与具体问题无关InputStream#available():因为在您的初始代码中并没有像您显然认为的那样做。它不会返回内容的整个长度。它只返回代码可以在不阻塞磁盘文件系统 I/O 的情况下读取的第一个块的长度,即它返回当前 I/O 缓冲区中内容的长度。这不一定代表整个内容长度!当然不是在更大的图像上。如果您使用的是 Java 7,则仅Files#copy()在唯一目的是使用尽可能少的代码完成工作时使用,如上所示。

于 2013-09-13T14:30:43.563 回答