我们的应用程序显示一个外部图像(客户端徽标),该图像特定于多租户环境中的每个客户端。在运行时动态确定图像文件的位置,并将图像流(作为字节)转移到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属性中提供图像的路径。客户端浏览器无法访问外部图像位置。只有应用程序服务器才能访问它。