Откройте 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;
}