我们正在使用java类从AWS s3存储桶下载文件,其中包含以下代码
inputStream = AWSFileUtil.getInputStream(
AWSConnectionUtil.getS3Object(null),
"cdn.generalsentiment.com", filePath);
AWSFileUtil是一个检查凭据并使用getInputStream方法从S3bucket获取输入流的类.filePath是cdn.generalsentiment.com存储桶中的文件。
我们想要编写一种方法,只需检查AWS S3存储桶中是否存在特定文件,并返回布尔值或其他值。
请建议我解决此问题。
public static boolean isValidFile(AmazonS3 s3,
String bucketName,
String path) throws AmazonClientException {
try {
ObjectMetadata objectMetadata =
s3.getObjectMetadata("cdn.generalsentiment.com", path);
} catch (NotFoundException nfe) {
nfe.printStackTrace();
}
return true;
}
如果文件存在则返回true,否则抛出NotFoundException,我想捕获并返回“isValidFile”方法结果为false。 对于方法体或返回类型,任何其他替代方案都会很棒。
更新后的
public static boolean doesFileExist(AmazonS3 s3,
String bucketName,
String path) throws AmazonClientException,
AmazonServiceException {
boolean isValidFile = true;
try {
ObjectMetadata objectMetadata =
s3.getObjectMetadata("cdn.generalsentiment.com", path);
} catch (NotFoundException nfe) {
isValidFile = false;
}
catch (Exception exception) {
exception.printStackTrace();
isValidFile = false;
}
return isValidFile;
}
答案 0 :(得分:22)
Daan's answer使用GET Bucket (List Objects)(通过AWS for Java中的相应包装器,见下文)是一次获取多个对象所需信息的最有效方法(+1),当然,你需要相应地发布回复。
这最容易通过Class AmazonS3Client的相应方法之一完成,例如listObjects(String bucketName):
AmazonS3 s3 = new AmazonS3Client(); // provide credentials, if need be
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
.withBucketName("cdn.generalsentiment.com");
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
如果您一次只对单个对象(文件)感兴趣,那么使用HEAD Object会更有效率,只要您可以直接从相应的HTTP响应代码中推断存在(请参阅Error Responses for details ),即404 Not Found表示 NoSuchKey的响应 - 指定的键不存在。
同样,这最容易通过Class AmazonS3Client完成,即getObjectMetadata(String bucketName, String key),例如:
public static boolean isValidFile(AmazonS3 s3,
String bucketName,
String path) throws AmazonClientException, AmazonServiceException {
boolean isValidFile = true;
try {
ObjectMetadata objectMetadata = s3.getObjectMetadata(bucketName, path);
} catch (AmazonS3Exception s3e) {
if (s3e.getStatusCode() == 404) {
// i.e. 404: NoSuchKey - The specified key does not exist
isValidFile = false;
}
else {
throw s3e; // rethrow all S3 exceptions other than 404
}
}
return isValidFile;
}
答案 1 :(得分:2)
使用GET Bucket S3 API:
http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html
并指定完整的文件名作为前缀。
答案 2 :(得分:0)
这是在存储桶中查找现有文件夹的简单方法。以上答案也是如此。 文件夹名称最后包含'/', 它返回true。
注意:mybucket / userProfileModule / abc.pdf,它是我的文件夹structrue
foreach (MembershipUser user in Model)
{
ProfileBase pb = ProfileBase.Create(user.UserName, true);
//display fields
}