我有一个控制器提供来自外部目录的图像(比如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)。提前谢谢。
答案 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"%>