我正在尝试使用ResponseEntity<Resource>
作为控制器方法响应类型,使用Spring MVC发送jpg图像。
如果资源是FileSystemResource
,它可以正常工作,但当我尝试使用InputStreamResource
ResourceHttpMessageConverter
询问内容长度时,InputStreamResource
会抛出异常(来自AbstractResource
方法,因为没有任何文件可以从中读取长度。如果方法返回ResourceHttpMessageConverter
,则null
会继续。
是否有其他方法可以将InputStream
用作Resource
作为ResponseEntity
?
答案 0 :(得分:2)
例如,您可以将其复制到字节数组(或直接使用输入流 - 我没有使用输入流对其进行测试)。
@RequestMapping(value = "/{bid}/image", method = RequestMethod.GET)
public HttpEntity<byte[]> content(@PathVariable("bid") final MyImage image) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(...);
headers.setContentLength(image.getSize());
return new HttpEntity<byte[]>(this.image.getContentAsByteArray(), headers);
}
提示:对于10MB以上的大内容,设置ContentLength非常重要。如果你错过了一些浏览器将无法正确下载它。 (没有ContentLength的确切文件大小是浏览器依赖的)
答案 1 :(得分:0)
尝试一下:
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=filename.jpg")
.contentLength(length)
.contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE)
.body(new InputStreamResource(inputStream));