2011-07-07 50 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

請看看,讓我知道,如果這符合你的情況。我認爲這應該工作。