Mit Spring 3.0 können Sie die HttpEntity
Objekt zurückgeben. Wenn Sie dies verwenden, benötigt Ihr Controller kein HttpServletResponse
Objekt und ist daher einfacher zu testen. Abgesehen davon ist diese Antwort relativ gleichwertig mit der von Infeligo .
Wenn der Rückgabewert Ihres pdf-Frameworks ein Byte-Array ist (lesen Sie den zweiten Teil meiner Antwort für andere Rückgabewerte) :
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
@PathVariable("fileName") String fileName) throws IOException {
byte[] documentBody = this.pdfFramework.createPdf(filename);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName.replace(" ", "_"));
header.setContentLength(documentBody.length);
return new HttpEntity<byte[]>(documentBody, header);
}
Wenn der Rückgabetyp Ihres PDF-Frameworks ( documentBbody
) nicht bereits ein Byte-Array ist (und auch keine ByteArrayInputStream
), dann wäre es ratsam NICHT um es zuerst zu einem Byte-Array zu machen. Stattdessen ist es besser, zu verwenden:
Beispiel mit FileSystemResource
:
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
@PathVariable("fileName") String fileName) throws IOException {
File document = this.pdfFramework.createPdf(filename);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName.replace(" ", "_"));
header.setContentLength(document.length());
return new HttpEntity<byte[]>(new FileSystemResource(document),
header);
}