Spring Boot - 将 AWS 中的文件从一个服务移动到另一个服务



我有 2 个服务 A 和 B,用户可以请求 A 下载文件。为此,服务 A 调用 B 请求文件,获取文件并以下载的形式向用户发送响应。

我尝试这样做的方法是,服务 B 在控制器中获取正确的调用。然后,它从 AWS 获取File对象并从中创建FileSystemResource,返回一个ResponseEntity<FileSystemResource>

我的问题是,当 A 收到响应时,它的主体为空。下载仍在进行,但我得到一个空文件(零字节(。知道我做错了什么吗?这可能吗?

服务 A 上的控制器

@GetMapping(value = "/get")
public ResponseEntity<FileSystemResource> downloadDocument(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse
) {
httpServletResponse.setHeader(
"Content-Disposition",
"attachment; filename=" + filename);
httpServletResponse.setHeader(
"Content-Type",
"application/octet-stream"
);
return ResponseEntity.ok(
documentsService.getDocumentToDownload(fileName));
}

服务 B 上的控制器

@GetMapping(value = "/get")
public ResponseEntity<FileSystemResource> downloadDocument(
@RequestParam(value = "fileName") String fileName,
HttpServletResponse httpServletResponse
) {
File doc = documentsService.getFileForDocumentInS3(
fileName);
return ResponseEntity.ok(
new FileSystemResource(doc.getAbsolutePath())
);
}

这就是我与 AWS 交互的服务(在服务 B 上(所做的。请注意,我的aws3Client变量是一个包含传输管理器的包装器。与 AWS 的连接性很好。

public File getFileForDocumentInS3(
String bucketName,
String fileKey
) {
try {
File toReturn = File.createTempFile(fileKey, ".tmp");
toReturn.deleteOnExit();
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, fileKey);
awsS3Client.getTransferManager().download(getObjectRequest, toReturn);
return toReturn;
} catch (Exception ex) {
//catching exception here
}
}

您在评论中提到,您选择在服务之间发送文件,因为您无法为受版本控制的存储桶中的特定版本生成签名 URL。

从 SDK 版本 1.11.123(当前最新版本为 1.11.186(开始,您可以使用如下GeneratedPresignedUrlRequest.withVersionId设置签名 URL 的版本 ID:

final URL url = s3.generatePresignedUrl(
new GeneratePresignedUrlRequest("my-bucket", "my-key", HttpMethod.GET)
.withVersionId("version-id")
);

相关内容

最新更新