mar*_*osh 138 spring-mvc
我byte[]从DB 获取图像数据(as ).如何返回此图片@ResponseBody?
编辑
我没有@ResponseBody使用HttpServletResponseas方法参数我做了:
@RequestMapping("/photo1")
public void photo(HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
IOUtils.copy(in, response.getOutputStream());
}
Run Code Online (Sandbox Code Playgroud)
使用@ResponseBody注册org.springframework.http.converter.ByteArrayHttpMessageConverter转换器作为@Sid说对我不起作用:(.
@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
Run Code Online (Sandbox Code Playgroud)
mic*_*man 95
如果您使用的是Spring版本的3.1或更新版本,则可以在@RequestMapping注释中指定"生成" .以下示例适用于我的开箱即用.如果你有web mvc enabled(@EnableWebMvc),则不需要寄存器转换器或其他任何东西.
@ResponseBody
@RequestMapping(value = "/photo2", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
Run Code Online (Sandbox Code Playgroud)
Jay*_*den 73
使用Spring 4.1及更高版本,您可以非常简单地返回任何内容(例如图片,pdf,文档,jar,拉链等),而无需任何额外的依赖项.例如,以下可能是从MongoDB GridFS返回用户的个人资料图片的方法:
@RequestMapping(value = "user/avatar/{userId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<InputStreamResource> downloadUserAvatarImage(@PathVariable Long userId) {
GridFSDBFile gridFsFile = fileService.findUserAccountAvatarById(userId);
return ResponseEntity.ok()
.contentLength(gridFsFile.getLength())
.contentType(MediaType.parseMediaType(gridFsFile.getContentType()))
.body(new InputStreamResource(gridFsFile.getInputStream()));
}
Run Code Online (Sandbox Code Playgroud)
需要注意的事项:
具有InputStreamResource的ResponseEntity作为返回类型
ResponseEntity构建器样式创建
使用此方法,您不必担心HttpServletResponse中的自动装配,抛出IOException或复制流数据.
Sig*_*gen 60
除了注册a之外ByteArrayHttpMessageConverter,您可能希望使用a ResponseEntity而不是@ResponseBody.以下代码适用于我:
@RequestMapping("/photo2")
public ResponseEntity<byte[]> testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_PNG);
return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED);
}
Run Code Online (Sandbox Code Playgroud)
Pey*_*nkh 16
通过使用Spring 3.1.x和3.2.x,您应该这样做:
控制器方法:
@RequestMapping("/photo2")
public @ResponseBody byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
Run Code Online (Sandbox Code Playgroud)
和servlet-context.xml文件中的mvc注释:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>image/jpeg</value>
<value>image/png</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)
s.i*_*pma 12
除了几个答案之外还有一些指针(Spring 4.1).
如果您的WebMvcConfig中没有配置任何messageconverters,那么ResponseEntity您的@ResponseBody工作内部就会很好.
如果你这样做,即你有一个MappingJackson2HttpMessageConverter配置(像我一样)使用ResponseEntity返回a org.springframework.http.converter.HttpMessageNotWritableException.
在这种情况下,唯一的工作解决方案是裹byte[]在@ResponseBody如下:
@RequestMapping(value = "/get/image/{id}", method=RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public @ResponseBody byte[] showImageOnId(@PathVariable("id") String id) {
byte[] b = whatEverMethodUsedToObtainBytes(id);
return b;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,请记住在WebMvcConfig中正确配置messageconverters(并添加一个ByteArrayHttpMessageConverer),如下所示:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(mappingJackson2HttpMessageConverter());
converters.add(byteArrayHttpMessageConverter());
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
return converter;
}
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
return arrayHttpMessageConverter;
}
private List<MediaType> getSupportedMediaTypes() {
List<MediaType> list = new ArrayList<MediaType>();
list.add(MediaType.IMAGE_JPEG);
list.add(MediaType.IMAGE_PNG);
list.add(MediaType.APPLICATION_OCTET_STREAM);
return list;
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个:
private ResourceLoader resourceLoader = new DefaultResourceLoader();
@ResponseBody
@RequestMapping(value = "/{id}", produces = "image/bmp")
public Resource texture(@PathVariable("id") String id) {
return resourceLoader.getResource("classpath:images/" + id + ".bmp");
}
Run Code Online (Sandbox Code Playgroud)
将媒体类型更改为您拥有的任何图像格式。
小智 6
在您的应用程序上下文中声明AnnotationMethodHandlerAdapter和registerByteArrayHttpMessageConverter:
<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>
Run Code Online (Sandbox Code Playgroud)
同样在处理程序方法中为您的响应设置适当的内容类型.
@RequestMapping(value = "/get-image",method = RequestMethod.GET)
public ResponseEntity<byte[]> getImage() throws IOException {
RandomAccessFile f = new RandomAccessFile("/home/vivex/apache-tomcat-7.0.59/tmpFiles/1.jpg", "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_PNG);
return new ResponseEntity<byte[]>(b, headers, HttpStatus.CREATED);
}
Run Code Online (Sandbox Code Playgroud)
为我工作.
小智 5
您应该在响应中指定媒体类型。我正在使用 @GetMapping 注释和产品 = MediaType.IMAGE_JPEG_VALUE。@RequestMapping 的工作方式相同。
@GetMapping(value="/current/chart",produces = MediaType.IMAGE_JPEG_VALUE)
@ResponseBody
public byte[] getChart() {
return ...;
}
Run Code Online (Sandbox Code Playgroud)
如果没有媒体类型,很难猜测实际返回的是什么(包括阅读代码的任何人、浏览器,当然还有 Spring 本身)。byte[] 只是不具体。从 byte[] 确定媒体类型的唯一方法是嗅探和猜测。
提供媒体类型只是最佳实践
| 归档时间: |
|
| 查看次数: |
166120 次 |
| 最近记录: |