2014-10-08 80 views
0

我有一個控制器從外部目錄(例如c:\ images \ userID \ photo.png)提供圖像,而且這個控制器很好地完成了它的工作。但是,我的JSP文件中的img標籤顯示圖像圖標,而不是此控制器返回的圖像。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); 
    } 
} 

我發現這裏閱讀其他答案,我需要在我的應用程序上下文了MessageConverter,我做到了。

這裏是我的應用程序的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

這春天的版本是U使用 – 2014-10-08 17:30:29

+0

這是3.2.1.RELEASE – 2014-10-08 17:39:40

+0

它顯示斷開的圖像圖標即使響應爲201 – 2014-10-08 18:25:07

回答

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

不要忘記儘快接受你自己的答案...... – 2014-10-09 05:51:52

0

有點谷歌搜索告訴我,HTTP 201意味着created。 如果圖像存在,你爲什麼要發送一個響應代碼告訴客戶你剛創建的圖像?

我不確定web瀏覽器如何處理它,但也許嘗試將您的響應代碼更改爲200,因爲您不是真的創建任何東西。

+0

我將響應代碼修改爲HttpStatus.OK(200),但仍無法正常工作。 – 2014-10-09 00:12:13

0

你可以考慮的替代,而不是控制器顯示可以直接訪問圖片你的JSP圖像爲此,你需要把映射信息在Spring配置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"%>