web-dev-qa-db-ja.com

ResponseEntity PDF=を新しいブラウザタブで開く

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ファイルを新しいタブで開くにはどうすればよいですか?

14
user1685185

試す

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)

違いを知るためにこれを読んでください インラインと添付ファイルの間

20
Koitoer
/* 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;
}
0
mykey

何が起こったかというと、レスポンスにヘッダーを「手動で」提供したため、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());
}
0
Danilo Teodoro