![]() |
文雅的登山鞋 · 大疆DJI POCKET2 ...· 4 月前 · |
![]() |
千杯不醉的松鼠 · Cookie -- JavaScript ...· 5 月前 · |
![]() |
大力的饺子 · 浙江大学计算机程序设计能力考试_百度百科· 6 月前 · |
![]() |
仗义的眼镜 · 乔姆斯基疑问词移位理论发展脉络· 6 月前 · |
![]() |
忧郁的篮球 · j9九游会电子阅读器行业报告 ...· 7 月前 · |
我想使用Java检查给定的存储桶中是否存在密钥。我查看了API,但没有任何有用的方法。我试图使用
getObject
,但它抛出了一个异常。
使用jets3t库。它比AWS sdk简单得多,健壮得多。使用这个库,您可以调用s3service.getObjectDetails()。这将只检查和检索对象的详细信息(而不是对象的内容)。如果对象丢失,它将抛出404。因此,您可以捕获该异常并在应用程序中处理它。
但为了使其正常工作,您需要为该存储桶上的用户提供ListBucket访问权限。仅仅是GetObject访问将不起作用。原因是,如果您没有ListBucket访问权限,亚马逊将阻止您检查密钥的存在。在某些情况下,仅仅知道密钥是否存在也足以满足恶意用户的需求。因此,除非他们拥有ListBucket访问权限,否则他们将无法这样做。
使用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;
}
更新:
似乎有一个新的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来检查这个流程--只是提供了关于异常的文档。
使用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;
}.
此java代码检查密钥(文件)是否存在于s3存储桶中。
public static boolean isExistS3(String accessKey, String secretKey, String bucketName, String file) {
// Amazon-s3 credentials
AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3Client s3Client = new AmazonS3Client(myCredentials);
ObjectListing objects = s3Client.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(file));
for (S3ObjectSummary objectSummary: objects.getObjectSummaries()) {
if (objectSummary.getKey().equals(file)) {
return true;
return false;
}
对于PHP (我知道问题是Java,但谷歌把我带到了这里),你可以使用流包装器和file_exists。
$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");
有一种简单的方法可以使用jetS3t API的isObjectInBucket()方法来完成此操作。
示例代码:
ProviderCredentials awsCredentials = new AWSCredentials(
awsaccessKey,
awsSecretAcessKey);
// REST implementation of S3Service
RestS3Service restService = new RestS3Service(awsCredentials);
// check whether file exists in bucket
if (restService.isObjectInBucket(bucket, objectKey)) {
//your logic
}
将你的路径分为bucket和object。使用
doesBucketExist
方法测试存储桶,使用列表的大小测试对象(如果不存在,则为0)。所以这段代码就行了:
String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket)
&& !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();
使用对象列表。用于检查指定密钥是否存在于亚马逊网络服务S3中的Java函数。
boolean isExist(String key)
ObjectListing objects = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(key));
for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
if (objectSummary.getKey().equals(key))
return true;
return false;
}
现在,在官方Java API中有一个 doesObjectExist 方法。
享受吧!
或者,您可以使用 Minio-Java 客户端库,它是开源的,并且与亚马逊网络服务S3应用编程接口兼容。
您可以使用Minio-Java StatObject.java 示例来实现同样的目的。
import io.minio.MinioClient;
import io.minio.errors.MinioException;
import java.io.InputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import org.xmlpull.v1.XmlPullParserException;
public class GetObject {
public static void main(String[] args)
throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are
// dummy values, please replace them with original values.
// Set s3 endpoint, region is calculated automatically
MinioClient s3Client = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
InputStream stream = s3Client.getObject("my-bucketname", "my-objectname");
byte[] buf = new byte[16384];
int bytesRead;
while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
System.out.println(new String(buf, 0, bytesRead));
stream.close();
}
我希望它能帮上忙。
免责声明:我为 Minio 工作
在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;
}
正如其他人所提到的,对于AWS S3 Java SDK 2.10+,您可以使用 HeadObjectRequest 对象来检查您的S3存储桶中是否有文件。这将表现为一个GET请求,而不是实际获取文件。
示例代码,因为其他人实际上没有在上面添加任何代码:
public boolean existsOnS3 () throws Exception {
try {
S3Client s3Client = S3Client.builder ().credentialsProvider (...).build ();
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder ().bucket ("my-bucket").key ("key/to/file/house.pdf").build ();
HeadObjectResponse headObjectResponse = s3Client.headObject (headObjectRequest);
return headObjectResponse.sdkHttpResponse ().isSuccessful ();
catch (NoSuchKeyException e) {