返回在 REST 控制器中包装 S3Object.getObjectContent() 的 ResponseEntity<InputStreamResource> 是否安全?

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()自动关闭吗?到目前为止,我的方法很成功,但我不太确定未来可能产生的后果。

ilj*_*lja 5

经过一番研究,我找到了答案,这应该适用于我的问题。

Tl;dr 版本:Spring MVC处理给定输入流的关闭,因此我上面描述的方法应该是安全的。