2016-06-22 1 views
0

Ich möchte ein PDF in einem neuen Tab öffnen, damit mein Spring Controller so ist (ich weiß nicht warum, aber ich muss .pdf sogar hinzufügen, mein URL param hat .pdf extension):Spring Controller gibt pdf inline mit fehlerhafter Kopfzeile zurück

@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; 
    } 
} 

aber ich erhalte 406 Fehler: The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers. Wie muss ich meine Header konfigurieren Dank

+0

Haben Sie tatsächlich überprüft, was eine 406 ist und was der Fehler Ihnen sagt? Es sagt Ihnen, dass Sie etwas anfordern, aber kein PDF. In Ihrem Mapping geben Sie explizit an, dass es 'application/pdf' zurückgibt, aber Ihr Browser hat wahrscheinlich' text/html' und einige andere Header. diese stimmen daher nicht mit einem Fehler überein. Hinzugefügt '.pdf' zu der URL behebt dies, da dies die korrekte Konvertierung sowie eine Kopfzeile auslöst. –

+0

Ja, es legt kein PDF als akzeptiertes Format fest. Meine URL ist korrekt: http: // localhost: 8086/DART/fleetAndCar/Anwendungen/Autos/Akquisitionen/pdf/179/13_Test2.pdf – luca

Antwort

0

ich mit diesem Code aufgelöst:

@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()); 
    } 
} 

und private Methode

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(); 
    }