Spring - 在浏览器中显示PDF文件而不是下载

14

我正在尝试使用Spring在浏览器中显示PDF文件。

我的问题是,浏览器会下载该文件而不是显示它。

这是我的代码:

@RequestMapping(value="/getpdf1", method=RequestMethod.GET)
public ResponseEntity<byte[]> getPDF1() {


    HttpHeaders headers = new HttpHeaders();

    headers.setContentType(MediaType.parseMediaType("application/pdf"));
    String filename = "pdf1.pdf";

    headers.add("content-disposition", "inline;filename=" + filename);

    headers.setContentDispositionFormData(filename, filename);
    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(pdf1Bytes, headers, HttpStatus.OK);
    return response;
}

我期待你的答案!谢谢。


它对我不起作用。 - MMMMS
1
我能在浏览器上呈现一个 .csv 文件吗?需要设置什么才能实现呢? - Naanavanalla
尝试用"response.setContentType("text/plain; charset=utf-8");"替换"headers.setContentType(MediaType.parseMediaType("application/pdf"));" - cmplx96
我正在使用相同的代码来处理图像/png,但它仍在下载中。 - Yo Man
6个回答

28

使用Content-Disposition来控制是下载还是在浏览器中查看

在浏览器中查看

headers.add("Content-Disposition", "inline; filename=" + "example.pdf");

下载

headers.add("Content-Disposition", "attachment; filename=" + "example.pdf");

我正在使用相同的代码来处理图像/png,但它仍在下载。 - Yo Man
但是这个解决方案是关于PDF文件的,你能否提供更多关于image/png文件的代码信息? - WLiu

15
你快完成了。只需删除

headers.setContentDispositionFormData(filename, filename);

从你的代码块中调用它。当向服务器发布multipart/form-data时,应该使用它。


我尝试了这样做,但仍然是下载而不是在浏览器中查看。这里的确切解决方案是什么? - MMMMS
1
解决方案:使用问题中的代码块,但不包括 setContentDispositionFormData。也许你应该发布一个新的问题。 - ksokol
不是很相关,但你知道如何在新标签页中打开PDF查看器时移除弹簧叶图标(网页浏览器图标)吗? - JayC
将您的网站图标放在根目录下,例如http://localhost/favicon.ico。另请参阅https://www.w3.org/2005/10/howto-favicon。 - ksokol

3
以下代码片段将帮助您在浏览器上显示文件。
@GetMapping(value = "/terms-conditions")
    public ResponseEntity<InputStreamResource> getTermsConditions() {

        String filePath = "/path/to/file/";
        String fileName = "fileName.pdf";
        File file = new File(filePath+fileName);
        HttpHeaders headers = new HttpHeaders();      
        headers.add("content-disposition", "inline;filename=" +fileName);
        
        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/pdf"))
                .body(resource);
    }

有没有一种方法可以在编辑时创建文件的实时预览? - backToStack

0

它正在工作,你应该尝试这样做,通过文件名获取并在浏览器中打开

  @GetMapping(value = "/pdf/{filename:.+}") public ResponseEntity<InputStreamResource> getTermsConditions(@PathVariable String filename) {

    File file = storageService.load(filename).getFile();
 
    HttpHeaders headers = new HttpHeaders();      
    headers.add("content-disposition", "inline;filename=" +fileName);
    
    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.parseMediaType("application/pdf"))
            .body(resource);
}

-1

在浏览器中查看(使用内联):

header.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=" + pdfFile.getName());

下载方式(使用附件):

header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + pdfFile.getName());

-1
请看下面的代码:
headers.setContentDisposition(ContentDisposition.inline().filename("example.pdf").build());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接