2016-06-22 1 views
0

새 탭에서 pdf를 열고 싶습니다. 스프링 컨트롤러가 너무 (왜 그런지 모르지만 내 URL 매개 변수도 .pdf를 추가해야합니다.) :스프링 컨트롤러가 잘못된 헤더가있는 PDF 인라인을 반환합니다.

@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'과 다른 헤더를 가지고있을 것입니다. 그것들은 오류와 일치하지 않습니다. URL에'.pdf'를 추가하면 정확한 변환과 헤더가 트리거되므로이를 수정합니다. –

+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(); 
    } 
관련 문제