【问题标题】:Spring MVC Image Controller, to display Image Bytes in JSPSpring MVC 图像控制器,在 JSP 中显示图像字节
【发布时间】:2011-07-07 00:17:00
【问题描述】:

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

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

显示它们的最简单方法是什么?我需要什么样的 servlet/控制器在 JSP 上显示图像字节?应该是一个简单的问题,但我无法在任何地方找到完整的解决方案。

我的理解是我需要一个单独的控制器,比如 ImgController/id=,它将根据请求参数显示图像字节,然后在我的 JSP 中我可以有 img src="ImgController/id..." .但是如何实现和连接这个控制器呢?

任何帮助或示例将不胜感激。非常感谢。

【问题讨论】:

  • 我发现一个简单的解决方案是根据请求参数 (ID) 使用一个普通的 Servlet(不是 MVC 控制器,而只是一个 HttpServlet)来提供图像。但是,在这种情况下,我们超出了 SpringMVC 容器,无法实现自动 DB 访问。因此,我将一个 HashMap (ID->Blob) 放入会话中,该 HashMap (ID->Blob) 是从一些可以访问数据库的初始 SpringMVC 控制器中设置的。有了这个公开可用的会话属性,ImgServlet 可以在不去数据库的情况下获取字节。有用。但是一个合适的 SpringMVC 解决方案会很好。
  • 您是否打算使用 Spring 的 MVC 注释或扩展 org.springframework.web.servlet.mvc 中已弃用的类之一,例如 AbstractController?

标签: image jsp spring-mvc controller


【解决方案1】:

最简单的解决方案(尽可能少写)是返回类型为 OutputStream 或 ResponseEntity 的 Spring MVC 控制器方法。

我更喜欢:返回一个 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();
    }

【讨论】:

  • 谢谢,它确实帮助我将图像从控制器返回到 :)
【解决方案2】:

我已经编译了一些代码here

请看一下,让我知道这是否适合您的情况。我认为这应该可行。

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 2013-06-20
    • 2011-08-28
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多