Spring MVC Image Controller, для отображения байтов изображения в JSP - PullRequest
2 голосов
/ 07 июля 2011

У меня есть приложение Spring MVC, и одна из JSP должна показывать изображения, поступающие из базы данных.

Изображения хранятся в БД в виде BLOB-объектов.

Какой самый простой способотображать их?Какой тип сервлета / контроллера мне нужно показывать на JSP байтов изображения?Должно быть, это простой вопрос, но я нигде не смог найти полного решения.

Насколько я понимаю, мне нужен отдельный контроллер, скажем ImgController / id =, который будет отображать байты изображения на основепараметр запроса, а затем в моем JSP я могу иметь img src = "ImgController / id ...".Но как мне реализовать и подключить этот контроллер?

Любая помощь или пример будут очень признательны.Большое спасибо.

Ответы [ 2 ]

8 голосов
/ 07 июля 2011

Самым простым решением (с точки зрения написания как можно меньше) является метод контроллера 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();
    }
2 голосов
/ 15 мая 2012

Я скомпилировал некоторый код здесь !

Пожалуйста, посмотрите и дайте мне знать, подходит ли это для вашего случая.Я думаю, что это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...