我正在开发 Spring Boot 后端应用程序。
我必须从我的数据库中的BLOB字段中检索jpg图像并将其返回到前端。
在线搜索我发现本教程有关控制器应如何返回要显示的文件:http://www.leveluplunch.com/java/tutorials/032-return-file-from-spring-rest-webservice/
正如您在上一个教程中所看到的,它可以执行以下操作:
@RequestMapping(value = "/", method = RequestMethod.GET, produces = "application/pdf")
public ResponseEntity<InputStreamResource> downloadPDFFile()
throws IOException {
ClassPathResource pdfFile = new ClassPathResource("pdf-sample.pdf");
return ResponseEntity
.ok()
.contentLength(pdfFile.contentLength())
.contentType(
MediaType.parseMediaType("application/octet-stream"))
.body(new InputStreamResource(pdfFile.getInputStream()));
}
因此,它返回一个包含在 ResponseEntity 中的 InputStreamResource 对象。
过去我使用标准的Java 字节数组来实现。阅读文档我发现 InputStreamResource 是一个特定的Spring对象:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/InputStreamResource.html
所以,根据我的理解,我有标准的Java InputStream 类型,它是一个抽象类,它是表示输入字节流的所有类的超类(所以类似于我在过去完成)。然后 InputStreamResource (在上一个教程中使用)是 InputStream 的特定资源实现。
阅读文档资源是一个Spring接口,用于描述任何类型的资源(如图像,文件,etcetc)。
所以我怀疑 InputStreamResource 是将 JPEG文件作为字节数组返回到我的前端应用程序的正确选择吗?
我有这个疑问,因为在我阅读的官方文件中:
只应在没有其他特定资源实现的情况下使用 适用。特别是,喜欢ByteArrayResource或任何一个 基于文件的资源实现尽可能。
这是一个很好的解决方案吗?
答案 0 :(得分:2)
通常,将流式结果反馈给客户端是个好主意。原因很简单,图像和附件越来越大。返回字节数组时,必须同时在内存中包含所有这些字节。如果您发送的图像或附件太大而无法立即存入内存,则会向您介绍意外拒绝服务事件。
一般准则:
ClassPathResource
。FileSystemResource
可以在磁盘上返回文件InputStreamResource
。示例是返回blob内容如何使用InputStreamResource
:
return new InputStreamResource(blob.getPayload().openStream()) {
@Override
public long contentLength() {
return blob.getMetadata().getContentMetadata().getContentLength();
}
};
我会提醒人们不要忘记返回一个字节数组。只应考虑您的响应大小是否大约为1MB。