作为我的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转换为文件的现代示例中都使用了这种方法,但是我似乎是一个特例。我在这里错过了把戏吗?

感谢任何帮助!

最佳答案

从AWS文档中:

public S3Object getObject(GetObjectRequest getObjectRequest)


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


public S3ObjectInputStream getObjectContent()


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




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

08-07 14:21