2016-06-22 4 views
0

Я хотел бы открыть pdf-файл на новой вкладке, чтобы мой контроллер Spring был таким (я не знаю, почему, но я должен добавить .pdf, даже мой url param имеет расширение .pdf):Контроллер весны возвращает PDF inline с плохим заголовком

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_FLEET_ENG', 'ROLE_VIEW_ENG')") 
@Override 
@RequestMapping(value = { "applications/cars/acquisitions/pdf/{idAcquisition}/{pdfName}"},produces = "application/pdf", method = RequestMethod.GET) 
public @ResponseBody ResponseEntity<byte[]> showPdf(@PathVariable("idAcquisition") int idAcquisition, @PathVariable("pdfName") String pdfName){ 
    try { 
     byte[] pdfContents = fleetAndCarService.showPdf(idAcquisition, pdfName + ".pdf"); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.parseMediaType("application/pdf")); 
     headers.add("content-disposition", "inline; filename=" + pdfName +".pdf"); 
     ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
       pdfContents, headers, HttpStatus.OK); 
     return response;  
    } 
    catch (Exception e) { 
     ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e); 
     LOG.error("Threw exception in FleetAndCarControllerImpl::showPdf :" + errorResponse.getStacktrace()); 
     //TODO what do I have to return? 
     return null; 
    } 
} 

но я получаю 406 ошибку: The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers. Как я должен настроить свой заголовок Благодаря

+0

Вы действительно проверили, что такое 406 и что говорит вам ошибка? Это говорит вам, что вы запрашиваете что-то, но не PDF. В вашем сопоставлении вы явно указываете, что он возвращает 'application/pdf', но ваш браузер, вероятно, имеет« text/html »и некоторые другие заголовки. это не соответствует ошибке. Добавленный '.pdf' к URL-адресу исправляет это, поскольку это вызывает правильное преобразование, а также заголовок. –

+0

Да, он не устанавливает формат pdf в качестве принятого формата. Мой URL правильный: http: // localhost: 8086/DART/fleetAndCar/applications/cars/acquisitions/pdf/179/13_Test2.pdf – luca

ответ

0

Я решил с этим кодом:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_FLEET_ENG', 'ROLE_VIEW_ENG')") 
@Override 
@RequestMapping(value = { "applications/cars/acquisitions/pdf/{idAcquisition}/{pdfName}"}, method = RequestMethod.GET) 
public void showPdf(HttpServletResponse response, @PathVariable("idAcquisition") int idAcquisition, @PathVariable("pdfName") String pdfName){ 
    File pdfFile= null;; 
    try { 
     pdfFile = fleetAndCarService.showPdf(idAcquisition, pdfName + ".pdf"); 
    } catch (Exception e) { 
     ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e); 
     LOG.error("Threw exception in FleetAndCarControllerImpl::showPdf :" + errorResponse.getStacktrace()); 
    } 
    try(InputStream is = new FileInputStream(pdfFile.getAbsolutePath());) { 
     setResponse(response, is, pdfFile, "inline; filename="); 
    } 
    catch (Exception e) { 
     ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e); 
     LOG.error("Threw exception in FleetAndCarControllerImpl::showPdf :" + errorResponse.getStacktrace()); 
    } 
} 

и частный метод

private void setResponse(HttpServletResponse response, InputStream is, File file, String useOfFile) throws Exception{ 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0"); 
     response.setContentType(Files.probeContentType(file.toPath())); 
     response.setHeader("Content-Description"," File Transfer"); 
     response.setHeader("Content-Disposition", useOfFile + file.getName()); 
     response.setHeader("Content-Transfer-Encoding"," binary"); 
     long size = Utils.stream(is, response.getOutputStream()); 
     response.addHeader("Content-Length", Long.toString(size)); 
     response.flushBuffer(); 
    }