Javaで生成したPDFをブラウザへ返したところ、表示する前にダウンロードが始まりました。レスポンスの種類と、表示方法を指定するヘッダーを確認します。
- 発生した問題
- 解決方法
背景。JasperReportsで生成したPDFをレスポンスへ書き出し、Edgeで開きました。プレビューしたいURLで、汎用のファイル形式と保存を促す指定を返していました。
修正前
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"sample.pdf\"");application/octet-stream は汎用のバイナリです。attachment はファイルとして扱うようブラウザに伝え、filename は保存時のファイル名の候補になります。
プレビュー用のレスポンスではPDFとして application/pdf を返し、inline を指定します。次の例では、保存用のURLにも同じPDFのバイト列を渡せます。
import java.io.IOException;
import jakarta.servlet.http.HttpServletResponse;
public final class PdfResponse {
private PdfResponse() {}
public static void send(HttpServletResponse response, byte[] pdf, boolean preview)
throws IOException {
String disposition = preview ? "inline" : "attachment";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", disposition + "; filename=\"sample.pdf\"");
response.getOutputStream().write(pdf);
}
}ブラウザ側のPDF表示設定によっては、inline を指定してもダウンロードされます。開発者ツールでContent-TypeとContent-Dispositionを確認すると、サーバーが返した指定を切り分けられます。
