ilj*_*lja 3 java amazon-s3 spring-boot aws-java-sdk
我正在开发一个 Spring Boot 应用程序,它应该允许用户通过指定的应用程序 REST 接口间接从 Amazon S3 下载文件。为此,我有一个 REST-Controller,它向用户返回一个 InputStreamResource,如下所示:
@GetMapping(path = "/download/{fileId}")
public ResponseEntity<InputStreamResource> downloadFileById(@PathVariable("fileId") Integer fileId) {
Optional<LocalizedFile> fileForDownload = fileService.getConcreteFileForDownload(fileId);
if (!fileForDownload.isPresent()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileForDownload.get().getFilename())
.body(new InputStreamResource(fileService.download(fileForDownload.get())));
}
Run Code Online (Sandbox Code Playgroud)
文件服务中的下载方法如下:
@Override
public InputStream download(LocalizedFile file) {
S3Object obj = s3client.getObject(bucketName, file.getFilename());
return obj.getObjectContent();
}
Run Code Online (Sandbox Code Playgroud)
我担心的是,来自 Amazon SDK 的输入流无法在控制器中显式关闭。getObjectContent() 方法的 AWS 文档中有以下警告,这让我对上述方法是否成功表示怀疑:
如果您检索 S3Object,则应尽快关闭此输入流,因为对象内容不会在内存中缓冲并直接从 Amazon S3 进行流式传输。此外,未能关闭此流可能会导致请求池被阻塞。
因此我的问题是:返回ResponseEntity<InputStreamResource>
控制器是否安全?下载成功后这个InputStream会S3Object.getObjectContent()
自动关闭吗?到目前为止,我的方法很成功,但我不太确定未来可能产生的后果。
归档时间: |
|
查看次数: |
1975 次 |
最近记录: |