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

And*_*ili 5 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()));
}
Run Code Online (Sandbox Code Playgroud)

因此,它返回包装在ResponseEntity中InputStreamResource对象。

过去,我使用标准的Java 字节数组来完成此操作。阅读文档后,我发现InputStreamResource是特定的Spring对象:http : //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/InputStreamResource.html

因此,据我了解,我有一个标准的Java InputStream类型,它是一个抽象类,它是表示字节输入流的所有类的超类(类似于我过去所做的事情)。然后InputStreamResource(在上一教程中使用)是InputStream的特定Resource实现。

阅读文档Resource是一个Spring界面,用于描述任何类型的资源(例如图像,文件等)。

因此,我怀疑InputStreamResource是将JPEG文件作为字节数组返回到前端应用程序的正确选择吗?

我对此表示怀疑,因为在官方文档中我读到:

仅在没有其他特定资源实现适用的情况下才应使用。特别是,在可能的情况下,最好选择ByteArrayResource或任何基于文件的Resource实现。

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

Ber*_*sch 5

一般而言,将结果流式传输回客户端是个好主意。原因很简单,图片和附件越来越大。当您返回一个字节数组时,您必须一次将所有这些字节存储在内存中。如果您发送的图像或附件太大而无法立即存储在内存中,则会导致您意外拒绝服务事件。

一般准则:

  • 如果有更好的资源类型,请使用它。在你的情况下,你可以ClassPathResource在你的响应实体中返回你的。
  • 还有一个FileSystemResource返回磁盘上的文件
  • 使用InputStreamResource如果没有已经是另一个资源类型。示例是返回 blob 内容

如何使用的示例InputStreamResource

    return new InputStreamResource(blob.getPayload().openStream()) {
        @Override
        public long contentLength() {
            return blob.getMetadata().getContentMetadata().getContentLength();
        }
    };
Run Code Online (Sandbox Code Playgroud)

我会警告不要懒惰地返回一个字节数组。仅当您的响应大小约为 1MB 或更少时才应考虑。