in *_*eps 74 java amazon-s3 amazon-web-services aws-sdk
我想检查使用Java在给定存储桶中是否存在密钥.我查看了API,但没有任何方法有用.我试图使用,getObject但它抛出异常.
mal*_*ana 246
现在官方Java API中有一个doesObjectExist方法.
请享用!
Ali*_*aka 56
使用 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);
}
Run Code Online (Sandbox Code Playgroud)
关于异常的注意事项:我知道异常不应该用于流控制.问题是亚马逊没有提供任何api来检查这个流程 - 只是关于异常的文档.
use*_*051 21
使用AWS SDK使用getObjectMetadata方法.如果密钥不存在,该方法将抛出AmazonServiceException.
private AmazonS3 s3;
...
public boolean exists(String path, String name) {
try {
s3.getObjectMetadata(bucket, getS3Path(path) + name);
} catch(AmazonServiceException e) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*per 12
在Amazon Java SDK 1.10+中,您可以使用getStatusCode()获取HTTP响应的状态代码,如果该对象不存在,则将为404.
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import org.apache.http.HttpStatus;
try {
AmazonS3 s3 = new AmazonS3Client();
ObjectMetadata object = s3.getObjectMetadata("my-bucket", "my-client");
} catch (AmazonS3Exception e) {
if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
// bucket/key does not exist
} else {
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
getObjectMetadata()消耗更少的资源,响应不需要像关闭一样getObject().
在以前的版本中,您可以使用getErrorCode()并检查相应的字符串(取决于版本).
小智 11
在 SDK V2 中执行此操作的正确方法是使用S3Client.headObject,而无需实际获取对象的过载。由AWS Change Log正式支持。
示例代码:
public boolean exists(String bucket, String key) {
try {
HeadObjectResponse headResponse = client
.headObject(HeadObjectRequest.builder().bucket(bucket).key(key).build());
return true;
} catch (NoSuchKeyException e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
使用jets3t库。它比AWS sdk更加轻松和强大。使用此库,您可以调用s3service.getObjectDetails()。这将仅检查和检索对象的详细信息(而不是对象的内容)。如果缺少该对象,它将抛出404。因此,您可以捕获该异常并在您的应用程序中对其进行处理。
但是,要使其正常工作,您将需要对该存储桶上的用户具有ListBucket访问权限。仅GetObject访问将不起作用。原因是,如果您没有ListBucket访问权限,Amazon将阻止您检查密钥是否存在。在某些情况下,仅知道密钥是否存在就足以满足恶意用户的需要。因此,除非他们具有ListBucket访问权限,否则他们将无法访问。
使用ListObjectsRequest设置前缀作为您的密钥.
.NET代码:
public bool Exists(string key)
{
using (Amazon.S3.AmazonS3Client client = (Amazon.S3.AmazonS3Client)Amazon.AWSClientFactory.CreateAmazonS3Client(m_accessKey, m_accessSecret))
{
ListObjectsRequest request = new ListObjectsRequest();
request.BucketName = m_bucketName;
request.Prefix = key;
using (ListObjectsResponse response = client.ListObjects(request))
{
foreach (S3Object o in response.S3Objects)
{
if( o.Key == key )
return true;
}
return false;
}
}
}.
Run Code Online (Sandbox Code Playgroud)
对于PHP(我知道问题是Java,但谷歌把我带到这里),你可以使用流包装器和file_exists
$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107558 次 |
| 最近记录: |