SPRING MVC 3 - 不在JSP中显示图像

时间:2014-10-08 17:28:39

标签: spring jsp spring-mvc

我有一个控制器提供来自外部目录的图像(比如c:\ images \ userID \ photo.png),这个控制器可以很好地完成它的工作。但是,我的JSP文件中的img标记显示图像图标而不是此控制器返回的图像。

这是我的控制器:

@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,并且我做到了。

这是我的application-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>

eclipse XML编辑器抱怨不推荐使用MethodHandlerAdapter。

JSP:

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

即使控制器正确发送响应,为什么图像不会显示(201)。提前谢谢。

3 个答案:

答案 0 :(得分:0)

一点点的谷歌搜索告诉我,HTTP 201意味着created。 如果图像存在,为什么要发送响应代码告诉客户刚刚创建了图像?

我不确定网页浏览器是如何处理它的,但也许会尝试将您的响应代码更改为200,因为您并非真正创建任何内容。

答案 1 :(得分: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);
    }
}

现在效果很好!我希望这有助于其他人。谢谢大家的回复。

答案 2 :(得分:0)

您可以考虑替代控制器显示图像,您可以直接访问您的jsp图像,为此您需要将映射信息放在您的弹簧配置xml中如左图  <mvc:resources mapping="/image/**" location="file:///D:/images/" />并且在你的jsp文件中你可以直接直接调用
 <img src="<spring:url value='/images/logo.png'/>" />并确保你已经在jsp中提到了spring标签

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>