1

作为我的 Web 服务的一部分,我有一个图片存储库,它从 Amazon S3(一个数据存储)检索图像然后返回它。这是执行此操作的方法的外观:

File getPicture(String path) throws IOException {
    File file = File.createTempFile(path, ".png");
    S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));
    IOUtils.copy(object.getObjectContent(), new FileOutputStream(file));
    return file;
}

问题是从服务获得响应需要太长时间——(下载一个 3MB 的图像需要 7.5 秒)。我注意到,如果我注释掉 IOUtils.copy() 行,响应时间会明显加快,所以一定是导致这种延迟的特定方法。

我在几乎所有将 S3Object 转换为文件的现代示例中都使用过这种方法,但我似乎是一个独特的案例。我在这里错过了一个技巧吗?

感谢任何帮助!

4

1 回答 1

2

从 AWS 文档:

public S3Object getObject(GetObjectRequest getObjectRequest)

返回的 Amazon S3 对象包含来自 HTTP 连接的直接数据流。在用户完成读取数据并关闭流之前,无法重用底层 HTTP 连接。

public S3ObjectInputStream getObjectContent()

注意:该方法是一个简单的 getter,实际上并不创建流。如果您检索 S3Object,则应尽快关闭此输入流,因为对象内容不会缓冲在内存中,而是直接从 Amazon S3 流式传输。


如果删除该IOUtils.copy行,则方法会快速退出,因为您实际上并未处理流。如果文件很大,下载需要时间。除非您能更好地连接到 AWS 服务,否则您对此无能为力。

于 2018-11-23T00:52:42.970 回答