1

我们的应用程序显示一个外部图像(客户端徽标),该图像特定于多租户环境中的每个客户端。图像文件的位置在运行时动态确定,图像流(以字节为单位)在 servlet 中传输到浏览器的输出流。如下所示

private void sendFileToDownload(HttpServletResponse resp) throws IOException {
    InputStream inputStream = new BufferedInputStream(new FileInputStream(fileNameWitPath));
    OutputStream outputStream = resp.getOutputStream();
    resp.setContentLength((int) inputStream.getLength());
    try {
        writeFileToOutput(inputStream, outputStream);
    } finally {
        finalize(inputStream, outputStream);
    }
}

private void writeFileToOutput(InputStream inputStream, OutputStream outputStream) throws IOException {
    byte[] b = new byte[32 * 1024];
    int count;
    while ((count = inputStream.read(b)) != -1) {
        outputStream.write(b, 0, count);
    }
}

private void finalize(InputStream inputStream, OutputStream outputStream) throws IOException {
    try {
        outputStream.flush();
    } catch (IOException e) {
        logger.debug("IOException was caught while flushing the output stream.", e);
    }
    inputStream.close();
}

在负载测试中,我们发现当多个线程 (~300) 执行相同的操作时,打开和关闭文件是昂贵的操作。尤其是 FileInputStream 构造函数的执行。

我想了解在 java ee Web 应用程序中显示外部图像的替代方法。

请注意,出于安全原因,我们不能在 img html 标记的 src 属性中给出图像的路径。客户端浏览器将无权访问外部图像位置。只有应用程序服务器可以访问它。

4

0 回答 0