Откройте ResponseEntity PDF на новой вкладке браузера
Я столкнулся с полезным кодом генерации PDF, чтобы показать файл клиенту в приложении Spring MVC ( "Возвращение сгенерированного 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 файл ( "Spring 3.0 Java REST return PDF document" ): produces = "application/pdf"
.
Моя проблема заключается в том, что при выполнении приведенного выше кода он немедленно просит клиента сохранить файл PDF. Я хочу, чтобы файл PDF просматривался первым в браузере, чтобы клиент мог решить, сохранять его или нет.
Я нашел "Как получить PDF-контент (обслуживаемый с помощью метода контроллера MVC Spring) в новом окне" , который предлагает добавить target="_blank"
в теге формы Spring. Я тестировал его и, как и ожидалось, показал новую вкладку, но снова появилось приглашение сохранения.
Другой "Я не могу открыть .pdf в моем браузере с помощью Java" , чтобы добавить httpServletResponse.setHeader("Content-Disposition", "inline");
, но я не использую HttpServletRequest
для выполните мой PDF файл.
Как я могу открыть PDF файл на новой вкладке, учитывая мой код/ситуацию?
Ответы
Ответ 1
Попробуйте
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);
Сообщите мне, если это работает
UPDATE
Это зависит от браузера и файла, который вы пытаетесь обслуживать. С помощью inline браузер попытается открыть файл в браузер.
headers.setContentDispositionFormData("inline", fileName);
или
headers.add("content-disposition", "inline;filename=" + fileName)
Прочитайте это, чтобы узнать разницу между встроенным и вложением
Ответ 2
/* 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;
}