このアプリケーションは、マルチテナント環境の各クライアントに固有の外部イメージ (クライアント ロゴ) を表示します。画像ファイルの場所は実行時に動的に決定され、画像ストリーム (バイト単位) はサーブレットでブラウザーの出力ストリームに転送されます。以下のように行われます
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 属性で画像へのパスを指定できないことに注意してください。クライアント ブラウザーは、外部の画像の場所にアクセスできません。アプリケーションサーバーのみがアクセスできます。