我想使用Java检查给定的存储桶中是否存在密钥。我查看了API,但没有任何有用的方法。我试图使用getObject
,但它抛出了一个异常。
发布于 2011-11-29 09:28:20
使用jets3t库。它比AWS sdk简单得多,健壮得多。使用这个库,您可以调用s3service.getObjectDetails()。这将只检查和检索对象的详细信息(而不是对象的内容)。如果对象丢失,它将抛出404。因此,您可以捕获该异常并在应用程序中处理它。
但为了使其正常工作,您需要为该存储桶上的用户提供ListBucket访问权限。仅仅是GetObject访问将不起作用。原因是,如果您没有ListBucket访问权限,亚马逊将阻止您检查密钥的存在。在某些情况下,仅仅知道密钥是否存在也足以满足恶意用户的需求。因此,除非他们拥有ListBucket访问权限,否则他们将无法这样做。
发布于 2016-04-16 01:06:46
现在,在官方Java API中有一个doesObjectExist方法。
享受吧!
发布于 2013-04-04 17:46:10
更新:
似乎有一个新的API来检查这一点。在这个页面中可以看到另一个答案:https://stackoverflow.com/a/36653034/435605
原文:
使用errorCode.equals("NoSuchKey")
try {
AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
String bucketName = getBucketName();
s3.createBucket(bucketName);
S3Object object = s3.getObject(bucketName, getKey());
} catch (AmazonServiceException e) {
String errorCode = e.getErrorCode();
if (!errorCode.equals("NoSuchKey")) {
throw e;
}
Logger.getLogger(getClass()).debug("No such key!!!", e);
}
关于异常的注意事项:我知道异常不应该用于流控制。问题是Amazon没有提供任何api来检查这个流程--只是提供了关于异常的文档。
https://stackoverflow.com/questions/8303011
复制相似问题