最簡單的解決方案(儘量少寫)是一個Spring MVC控制器方法,返回類型爲OutputStream或ResponseEntity。
我喜歡:返回一個ResponseEntity:
@RequestMapping(value = "/reportTemplate/{id}/content", method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadReportTemplateContent(
@PathVariable("id") final ReportTemplate reportTemplate)
throws IOException {
ReportDatei file = reportTemplate.getFile();
String fileName = reportTemplate.getName() + EXCEL_FILE_NAME_ENDING;
HttpHeaders responseHeaders = httpHeaderExcelFileAttachment(fileName,
datei.getDaten().length);
return new ResponseEntity<byte[]>(file.getDataArray(),
responseHeaders, HttpStatus.OK);
}
public static HttpHeaders httpHeaderExcelFileAttachment(final String fileName,
final int fileSize) {
String encodedFileName = fileName.replace('"', ' ').replace(' ', '_');
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.parseMediaType("application/vnd.ms-excel"));
responseHeaders.setContentLength(fileSize);
responseHeaders.set("Content-Disposition", "attachment");
responseHeaders.add("Content-Disposition", "filename=\"" + encodedFileName + '\"');
return responseHeaders;
}
但還有更多:
使用HttpServletResponse的直接
@RequestMapping(value = "/document/{id}/fileContent", method = RequestMethod.GET)
public void getDocumentFileContent(final HttpServletResponse response,
@PathVariable("id") final Document document)
throws IOException {
FileContentUtil.writeFileContentToHttpResponse(document.getFile(),
response, this.fileService);
}
public static void writeFileContentToHttpResponse(final CommonFileInfo fileInfo,
final HttpServletResponse response,
final FileService fileService) throws IOException {
String mimeType = fileInfo.getMimeType() != null ? fileInfo.getMimeType() : CommonFileInfo.DEFAULT_MIME_TYPE;
String fileName = fileInfo.getOriginalName().replace('"', ' ');
FileContent fileContent = fileService.loadFileContent(fileInfo.getFileContentBusinessId());
response.setContentType(mimeType);
response.setContentLength(fileInfo.getSize());
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + '"');
response.getOutputStream().write(fileContent.getContent());
response.getOutputStream().flush();
}
我發現的一個簡單的解決方案是基於請求參數(ID),擁有一個普通的Servlet(而不是一個MVC控制器,但僅僅是一個HttpServlet)來提供圖像。但是,在這種情況下,我們不在SpringMVC容器之外,並且自動DB訪問是遙不可及的。因此,我在會話中放入了一個HashMap(ID-> Blob),該HashMap從一些初始SpringMVC控制器中獲得,該初始SpringMVC控制器可以訪問數據庫。有了這個會話屬性公開可用,ImgServlet可以獲取字節,而不必去數據庫。有用。但一個合適的SpringMVC解決方案會很好。 – user783312
您打算使用Spring的MVC註釋還是擴展org.springframework.web.servlet.mvc(如AbstractController)中的一個不推薦使用的類? – laz