2014-10-08 2 views
0

У меня есть контроллер, обслуживающий изображения из внешнего каталога (скажем c: \ images \ userID \ photo.png), и этот контроллер выполняет свою работу очень хорошо. Тем не менее, тег img в моем JSP-файле показывает значок изображения вместо изображения, возвращаемого этим контроллером.SPRING MVC 3 - НЕ отображать изображение в JSP

Вот мой контроллер:

@RequestMapping(value = "/load/{imageId}/", method = RequestMethod.GET) 
public ResponseEntity<byte[]> loadImage(@PathVariable("imageId") Long imageId, HttpServletRequest request) 
{ 
    final org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders(); 
    BufferedImage image; 
    Photo photo = photoManager.getSinglePhoto(imageId); 
    headers.setContentType(MediaType.IMAGE_PNG); 

    try 
    { 
     if (photo == null) 
     { 
      File defaultFile = new File("c:/images/default.png"); 
      image = ImageIO.read(defaultFile); 

      return new ResponseEntity<byte[]>(((DataBufferByte)image.getData().getDataBuffer()).getData(), headers, HttpStatus.CREATED); 
     } 

     File file = new File(photo.getPath()); 
     image = ImageIO.read(file); 
     return new ResponseEntity<byte[]>(((DataBufferByte)image.getData().getDataBuffer()).getData(), headers, HttpStatus.CREATED); 
    } 
    catch (IOException ex) 
    { 
     return new ResponseEntity<byte[]>(null, headers, HttpStatus.NOT_FOUND); 
    } 
} 

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

Вот часть моего приложения-context.xml

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <util:list> 
      <bean id="byteArrayMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
     </util:list> 
    </property> 
</bean> 

Редактор XML затмение жалуется MethodHandlerAdapter устаревшим.

JSP:

<img src="/mavenspringapp/photo/load/131/" width="128" height="128" alt="laf02.jpg"> 

Почему не изображение отображается получение, даже когда контроллер отправляет ответ правильно (201). Заранее спасибо.

+0

версия пружины пользуется –

+0

это 3.2.1.RELEASE –

+0

он показывает значок сломанных изображений, даже если ответ 201 –

ответ

0

Проблема была в методе контроллера. По-видимому, загружать изображение так, как я это делал, сделано неправильно. Поэтому я изменил свой метод, как показано ниже:

@RequestMapping(value = "/load/{imageId}/", method = RequestMethod.GET) 
public ResponseEntity<byte[]> loadImage(@PathVariable("imageId") Long imageId, HttpServletRequest request) 
{ 
    final org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders(); 
    Photo photo = photoManager.getSinglePhoto(imageId); 
    headers.setContentType(MediaType.IMAGE_PNG); 

    try 
    { 
     if (photo == null) 
     { 
      File defaultFile = new File("c:/images/default.png"); 
      byte[] content = FileUtils.readFileToByteArray(defaultFile); 

      return new ResponseEntity<byte[]>(content, headers, HttpStatus.OK); 
     } 

     File file = new File(photo.getPath()); 
     byte[] content = FileUtils.readFileToByteArray(file); 
     return new ResponseEntity<byte[]>(content, headers, HttpStatus.OK); 
    } 
    catch (IOException ex) 
    { 
     return new ResponseEntity<byte[]>(null, headers, HttpStatus.NOT_FOUND); 
    } 
} 

И теперь он отлично работает! Надеюсь, это поможет кому-то другому. Спасибо всем за ваши ответы.

+0

Не забудьте принять свой собственный ответ, как только сможете ... –

0

Немного о поиске в Google говорит, что HTTP 201 означает created. Если изображение существует, почему вы отправляете код ответа, сообщающий клиенту, что вы только что создали изображение?

Я не знаю точно, как браузеры обрабатывают его, но, возможно, попробуйте изменить коды ответов на 200, так как вы действительно не являетесь , создавая ничего.

+0

Я изменил код ответа на HttpStatus.OK (200), все еще не работая. –

0

Вы можете рассмотреть альтернативу вместо контроллера отображения изображений можно непосредственно получить доступ к изображениям вашей JSP для этого вам нужно поместить информацию об отображении в вашей конфигурации XML пружинной как
<mvc:resources mapping="/image/**" location="file:///D:/images/" /> и в файле JSP вы можете напрямую можете Прямой вызов
<img src="<spring:url value='/images/logo.png'/>" /> и убедитесь, что ваш упоминали пружинного тега в вашей JSP

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
Смежные вопросы