2011-07-07 46 views
2

我有一个Spring MVC应用程序,其中一个JSP必须显示来自数据库的图像。Spring MVC图像控制器,在JSP中显示图像字节

图像以Blob的形式存储在数据库中。

什么是最简单的显示方式?我需要在JSP上显示什么样的servlet /控制器图像字节?应该是一个简单的问题,但我无法在任何地方找到完整的解决方案。我的理解是,我需要一个单独的控制器,说ImgController/id =,它将显示基于请求参数的图像字节,然后在我的JSP我可以有img src =“ImgController/id ... ”。但是,我如何实现并连接这个控制器?

任何帮助或例子将非常感激。非常感谢。

+0

我发现的一个简单的解决方案是基于请求参数(ID),拥有一个普通的Servlet(而不是一个MVC控制器,但仅仅是一个HttpServlet)来提供图像。但是,在这种情况下,我们不在SpringMVC容器之外,并且自动DB访问是遥不可及的。因此,我在会话中放入了一个HashMap(ID-> Blob),该HashMap从一些初始SpringMVC控制器中获得,该初始SpringMVC控制器可以访问数据库。有了这个会话属性公开可用,ImgServlet可以获取字节,而不必去数据库。有用。但一个合适的SpringMVC解决方案会很好。 – user783312

+0

您打算使用Spring的MVC注释还是扩展org.springframework.web.servlet.mvc(如AbstractController)中的一个不推荐使用的类? – laz

回答

8

最简单的解决方案(尽量少写)是一个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(); 
    } 
+0

谢谢,它确实帮助我将图像从控制器返回到 :) –

2

我编写一些代码here

请看看,让我知道,如果这符合你的情况。我认为这应该工作。