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实现。
这是一个好的解决方案吗?
一般而言,将结果流式传输回客户端是个好主意。原因很简单,图片和附件越来越大。当您返回一个字节数组时,您必须一次将所有这些字节存储在内存中。如果您发送的图像或附件太大而无法立即存储在内存中,则会导致您意外拒绝服务事件。
一般准则:
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 或更少时才应考虑。
| 归档时间: |
|
| 查看次数: |
2166 次 |
| 最近记录: |