Spring MVCアプリケーションでクライアントにファイルを表示するのに役立つPDF生成コードに遭遇しました( "Return generated PDF Spring MVCを使用 " ):
_@RequestMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf(DomainModel domain, ModelMap model) {
createPdf(domain, model);
Path path = Paths.get(PATH_FILE);
byte[] pdfContents = null;
try {
pdfContents = Files.readAllBytes(path);
} catch (IOException e) {
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
String filename = NAME_PDF;
headers.setContentDispositionFormData(filename, filename);
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
pdfContents, headers, HttpStatus.OK);
return response;
}
_
メソッドがPDF file( "Spring 3.0 Java REST return PDF document " ):_produces = "application/pdf"
_。
私の問題は、上記のコードが実行されるとすぐにクライアントにPDFファイルを保存するように要求することです。私はPDFファイルを最初に表示したいブラウザは、クライアントが保存するかどうかを決定できるようにします。
私は "を取得する方法PDFコンテンツ(Spring MVCコントローラーメソッドから提供)を新しいウィンドウに表示する方法 " Springフォームタグに_target="_blank"
_を追加することを提案しています。テストしたところ、予想通り、新しいタブが表示されましたが、保存プロンプトが再び表示されました。
もう1つは "Javaでブラウザで.pdfを開くことができない" を追加する方法httpServletResponse.setHeader("Content-Disposition", "inline");
でも、HttpServletRequest
を使用してPDFファイルを提供していません)。
コード/状況に応じてPDFファイルを新しいタブで開くにはどうすればよいですか?
試す
httpServletResponse.setHeader("Content-Disposition", "inline");
ただし、次のようにresponseEntityを使用します。
HttpHeaders headers = new HttpHeaders();
headers.add("content-disposition", "attachment; filename=" + fileName)
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
pdfContents, headers, HttpStatus.OK);
うまくいくはず
これについてはよくわかりませんが、setContentDispositionFormDataを使用しているようです。
headers.setContentDispositionFormData("attachment", fileName);
うまくいくか教えてください
[〜#〜]更新[〜#〜]
この動作は、ブラウザと、提供しようとしているファイルによって異なります。インラインでは、ブラウザはブラウザ内でファイルを開こうとします。
headers.setContentDispositionFormData("inline", fileName);
または
headers.add("content-disposition", "inline;filename=" + fileName)
違いを知るためにこれを読んでください インラインと添付ファイルの間
/* Here is a simple code that worked just fine to open pdf(byte stream) file
* in browser , Assuming you have a a method yourService.getPdfContent() that
* returns the bite stream for the pdf file
*/
@GET
@Path("/download/")
@Produces("application/pdf")
public byte[] getDownload() {
byte[] pdfContents = yourService.getPdfContent();
return pdfContents;
}
何が起こったかというと、レスポンスにヘッダーを「手動で」提供したため、Springは他のヘッダーを追加しませんでした(たとえば、produces = "application/pdf")。 Springを使用してブラウザーにPDFをインラインで表示するための最小コードは次のとおりです。
@GetMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf() {
// getPdfBytes() simply returns: byte[]
return ResponseEntity.ok(getPdfBytes());
}