Java 在新浏览器选项卡中打开ResponseEntity PDF

Java 在新浏览器选项卡中打开ResponseEntity PDF,java,spring,spring-mvc,pdf,Java,Spring,Spring Mvc,Pdf,我发现了一个有用的PDF生成代码,可以在Spring MVC应用程序()中将文件显示给客户端: @RequestMapping(value=“/form/pdf”,products=“application/pdf”) 公共响应显示PDF(域模型域、模型地图模型){ createPdf(域、模型); Path=Path.get(Path\u文件); 字节[]pdfContents=null; 试一试{ pdfContents=Files.readAllBytes(路径); }捕获(IOE异常){

我发现了一个有用的PDF生成代码,可以在Spring MVC应用程序()中将文件显示给客户端:

@RequestMapping(value=“/form/pdf”,products=“application/pdf”)
公共响应显示PDF(域模型域、模型地图模型){
createPdf(域、模型);
Path=Path.get(Path\u文件);
字节[]pdfContents=null;
试一试{
pdfContents=Files.readAllBytes(路径);
}捕获(IOE异常){
e、 printStackTrace();
}
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.parseMediaType(“application/pdf”);
字符串filename=NAME\u PDF;
headers.setContentDispositionFormData(文件名、文件名);
headers.setCacheControl(“必须重新验证,后检查=0,前检查=0”);
ResponseEntity response=新的ResponseEntity(
pdfContents、headers、HttpStatus.OK);
返回响应;
}
我添加了一个声明,该方法返回一个PDF文件():
products=“application/PDF”

我的问题是,当执行上述代码时,它会立即要求客户端保存PDF文件。我希望先在浏览器中查看PDF文件,以便客户端可以决定是否保存它

我发现这建议在Spring表单标签中添加
target=“\u blank”
。我测试了它,正如预期的那样,它显示了一个新的选项卡,但保存提示再次出现

另一种方法是添加
httpServletResponse.setHeader(“contentdisposition”,“inline”)
但我不使用
HttpServletRequest
来提供我的PDF文件

根据我的代码/情况,如何在新选项卡中打开PDF文件?

试试看

httpServletResponse.setHeader("Content-Disposition", "inline");
但是使用如下的响应

HttpHeaders headers = new HttpHeaders();
headers.add("content-disposition", "attachment; filename=" + fileName)
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
            pdfContents, headers, HttpStatus.OK);
让我知道这是否有效

更新

此行为取决于浏览器和您尝试创建的文件 发球。使用“内联”,浏览器将尝试在 浏览器


阅读本文以了解不同之处,因为您“手动”为响应提供了标题,所以Spring没有添加其他标题(例如products=“application/pdf”)。以下是使用Spring在浏览器中内联显示pdf的最低代码:

@GetMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf() {
    // getPdfBytes() simply returns: byte[]
    return ResponseEntity.ok(getPdfBytes());
}
@GetMapping(value=“/form/pdf”,products=“application/pdf”)
公众回应showPdf({
//getPdfBytes()只返回:byte[]
返回ResponseEntity.ok(getPdfBytes());
}

你好!我添加了
标题。添加(“内容处置”,“附件;文件名=”+filename)
,它仍然要求保存PDF:(它没有在新的浏览器选项卡中显示PDF文件(感谢您的编辑,是的,我错过了那一个)我在我的回答中添加了一个更新,尝试使用内联插入附件
标题进行拍摄。添加(“内容处置”,“inline;filename=“+filename”);
成功了(没有另一个)。谢谢!response.setHeader(“内容处置:inline”,“附件;filename=“+filename”);为IE工作,但是如何在
标题中对
文件名进行“编码”。添加(“内容处置”,“inline;filename=“+filename”)
?因为
“x.txt”附件的
文件名
;文件名*=UTF-8“trick.exe
会打乱客户端对HTTP头的解释这是一个Spring Boot?@products(“application/pdf”)似乎不是Spring Boot抱歉,我可能把它与我的其他Spring Boot项目混淆了。products(“application/pdf”)这里描述的是JAX-RS,
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;
}
@GetMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf() {
    // getPdfBytes() simply returns: byte[]
    return ResponseEntity.ok(getPdfBytes());
}