我可以使用InputStreamResource将图像作为ByteArray返回到Spring应用程序中吗?

时间:2016-11-13 15:55:26

标签: spring spring-mvc spring-boot

我正在开发 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或任何一个   基于文件的资源实现尽可能。

这是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

通常,将流式结果反馈给客户端是个好主意。原因很简单,图像和附件越来越大。返回字节数组时,必须同时在内存中包含所有这些字节。如果您发送的图像或附件太大而无法立即存入内存,则会向您介绍意外拒绝服务事件。

一般准则:

  • 如果有更好的资源类型,请使用它。在您的情况下,您只需在回复实体中返回ClassPathResource
  • 还有一个FileSystemResource可以在磁盘上返回文件
  • 如果还没有其他资源类型,请使用InputStreamResource。示例是返回blob内容

如何使用InputStreamResource

的示例
    return new InputStreamResource(blob.getPayload().openStream()) {
        @Override
        public long contentLength() {
            return blob.getMetadata().getContentMetadata().getContentLength();
        }
    };

我会提醒人们不要忘记返回一个字节数组。只应考虑您的响应大小是否大约为1MB。