ด้วย Spring 3.0 คุณสามารถใช้HttpEntity
วัตถุส่งคืน หากคุณใช้สิ่งนี้คอนโทรลเลอร์ของคุณไม่จำเป็นต้องมีHttpServletResponse
วัตถุดังนั้นจึงง่ายต่อการทดสอบ
ยกเว้นนี้คำตอบนี้คือเท่ากับเมื่อเทียบกับหนึ่ง Infeligo
หากค่าส่งคืนของเฟรมเวิร์ก pdf ของคุณเป็นอาร์เรย์ไบต์(อ่านส่วนที่สองของคำตอบของฉันสำหรับค่าส่งคืนอื่น ๆ ) :
@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);
}
หากประเภทคืนของ PDF Framework ของคุณ ( documentBbody
) ไม่ใช่อาร์เรย์ไบต์ (และไม่ใช่ByteArrayInputStream
) ก็จะเป็นการดีที่จะไม่ทำให้เป็นอาร์เรย์ไบต์ก่อน แทนที่จะเป็นการดีกว่าที่จะใช้:
ตัวอย่างด้วย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);
}