আমি জাভা ব্যবহার করে প্রদত্ত বালতিতে একটি কী উপস্থিত রয়েছে কিনা তা খতিয়ে দেখতে চাই। আমি এপিআইয়ের দিকে নজর রেখেছি কিন্তু এমন কোনও পদ্ধতি নেই যা কার্যকর। আমি ব্যবহার করার চেষ্টা করেছি getObject
কিন্তু এটি ব্যতিক্রম ছুঁড়েছে।
আমি জাভা ব্যবহার করে প্রদত্ত বালতিতে একটি কী উপস্থিত রয়েছে কিনা তা খতিয়ে দেখতে চাই। আমি এপিআইয়ের দিকে নজর রেখেছি কিন্তু এমন কোনও পদ্ধতি নেই যা কার্যকর। আমি ব্যবহার করার চেষ্টা করেছি getObject
কিন্তু এটি ব্যতিক্রম ছুঁড়েছে।
উত্তর:
Jets3t লাইব্রেরি ব্যবহার করুন। এটি এডাব্লুএস এসডিকে তুলনায় অনেক বেশি সহজ এবং শক্ত। এই লাইব্রেরিটি ব্যবহার করে আপনি s3service.getObjectDetails () কল করতে পারেন। এটি কেবলমাত্র অবজেক্টের (বিষয়বস্তু নয়) বিশদটি পরীক্ষা করে পুনরুদ্ধার করবে। যদি বস্তুটি অনুপস্থিত থাকে তবে এটি 404 নিক্ষেপ করবে। সুতরাং আপনি সেই ব্যতিক্রমটি ধরতে পারেন এবং আপনার অ্যাপ্লিকেশনটিতে এটি মোকাবেলা করতে পারেন।
তবে এটি কাজ করার জন্য আপনার সেই বালতিতে ব্যবহারকারীর জন্য তালিকাবুক অ্যাক্সেস থাকা দরকার। শুধু getObject অ্যাক্সেস কাজ করবে না। কারণ হ'ল অ্যামাজন আপনাকে লিস্টবকেটের অ্যাক্সেস না থাকলে কীটির উপস্থিতি যাচাই করতে বাধা দেবে। কীটি উপস্থিত রয়েছে কিনা তা কেবল জানা, কিছু ক্ষেত্রে ক্ষতিকারক ব্যবহারকারীদের পক্ষেও যথেষ্ট। অতএব যদি না তাদের তালিকায় থাকা অ্যাক্সেস না থাকে তবে তারা তা করতে সক্ষম হবে না।
অফিসিয়াল জাভা এপিআইতে এখন একটি doObjectExist পদ্ধতি রয়েছে।
উপভোগ করুন!
doesObjectExist
2.x এসডিকে (বর্তমানে v2.3.9) থেকে সরানো হয়েছে।
হালনাগাদ:
মনে হচ্ছে ঠিক এটি পরীক্ষা করার জন্য একটি নতুন এপিআই রয়েছে। এই পৃষ্ঠায় আরেকটি উত্তর দেখুন: 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);
}
ব্যতিক্রম সম্পর্কে দ্রষ্টব্য: আমি জানি ব্যতিক্রম প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহার করা উচিত নয়। সমস্যাটি হ'ল অ্যামাজন এই প্রবাহটি পরীক্ষা করতে কোনও এপিআই সরবরাহ করেনি - কেবল ব্যতিক্রম সম্পর্কে ডকুমেন্টেশন।
errorMessage
"সন্ধান পাওয়া যায়নি" তে সেট করা আছে তবে এটি errorCode
শূন্য।
NoSuchKey
। এস 3 ত্রুটি কোডগুলির একটি চূড়ান্ত তালিকার
AWS SDK ব্যবহার করে getObjectMetadata পদ্ধতিটি ব্যবহার করুন। কীটি উপস্থিত না থাকলে পদ্ধতিটি একটি অ্যামাজন সার্ভিস এক্সসেপশন নিক্ষেপ করবে।
private AmazonS3 s3;
...
public boolean exists(String path, String name) {
try {
s3.getObjectMetadata(bucket, getS3Path(path) + name);
} catch(AmazonServiceException e) {
return false;
}
return true;
}
আমাজন জাভা এসডিকে ১.১০+ তে, আপনি getStatusCode()
এইচটিটিপি প্রতিক্রিয়াটির স্থিতি কোড পেতে ব্যবহার করতে পারেন যা অবজেক্টটি উপস্থিত না থাকলে ৪০৪ হবে।
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;
}
}
getObjectMetadata()
কম সংস্থান গ্রহণ করে এবং প্রতিক্রিয়াটির মতো বন্ধ করার দরকার নেই getObject()
।
পূর্ববর্তী সংস্করণগুলিতে, আপনি getErrorCode()
যথাযথ স্ট্রিং ব্যবহার করতে এবং এটি পরীক্ষা করতে পারেন (সংস্করণটির উপর নির্ভর করে)।
আপনার কী হিসাবে তালিকার উপস্থাপনা উপস্থাপনের উপস্থাপনাটি ব্যবহার করুন।
নেট কোড:
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;
}
}
}.
এই জাভা কোডটি কি (ফাইল) এস 3 বালতিতে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে।
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;
}
বালতি এবং অবজেক্টে আপনার পাথ ভাঙ্গা। পদ্ধতিটি ব্যবহার করে বালতি পরীক্ষা করা doesBucketExist
, তালিকার আকার ব্যবহার করে অবজেক্টটি পরীক্ষা করা (যদি 0 উপস্থিত না থাকে তবে)। সুতরাং এই কোডটি করবে:
String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket)
&& !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();
অবজেক্ট ইস্টিং ব্যবহার করে। অ্যাডাব্লুএস এস 3-তে নির্দিষ্ট কী উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে জাভা ফাংশন।
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;
}
আসল বস্তুটির ওভারলোড ব্যতীত এসডিকে ভি 2-তে এটি করার সঠিক উপায় হ'ল এস 3 ক্লায়েন্ট.হেডঅবজেক্টটি ব্যবহার করা । আনুষ্ঠানিকভাবে এডাব্লুএস চেঞ্জ লগ দ্বারা সমর্থিত ।
উদাহরণ কোড:
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;
}
}
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
}
অন্যান্য উত্তরগুলি এডাব্লুএস এসডিকে ভি 1 এর জন্য। AWS SDK v2 (বর্তমানে ২.৩.৯) এর জন্য একটি পদ্ধতি এখানে রয়েছে।
নোট করুন getObjectMetadata
এবং doesObjectExist
পদ্ধতিগুলি বর্তমানে ভি 2 এসডিকে নেই! সুতরাং সেগুলি আর বিকল্প নয়। আমরা হয় ব্যবহার করতে বাধ্য হয় getObject
বা হয় listObjects
।
listObjects
কলগুলি তুলনায় বর্তমানে 12.5 গুণ বেশি ব্যয়বহুল getObject
। তবে এডাব্লুএস ডাউনলোড করা কোনও ডেটার জন্যও চার্জ করে, যা getObject
ফাইলটি উপস্থিত থাকলে দাম বাড়ায় । যতক্ষণ না ফাইলটির অস্তিত্বের পক্ষে খুব কম সম্ভাবনা থাকে (উদাহরণস্বরূপ, আপনি এলোমেলোভাবে একটি নতুন ইউইউডি কী তৈরি করেছেন এবং এটি নেওয়া হয়নি তা ডাবল-চেক করতে হবে) তারপরে getObject
আমার গণনা দ্বারা কলিং উল্লেখযোগ্যভাবে সস্তা।
যদিও কেবল নিরাপদ দিকে থাকতে, আমি range()
AWS কে কেবলমাত্র ফাইলের কয়েকটি বাইট প্রেরণ করতে বলার জন্য একটি স্পেসিফিকেশন যুক্ত করেছি । আমি যতদূর জানি এসডিকে সর্বদা এটি সম্মান করবে এবং পুরো ফাইলটি ডাউনলোড করার জন্য আপনাকে চার্জ করবে না। কিন্তু আমি যাচাই করি নি যে নিজের ঝুঁকিতে সেই আচরণের উপর নির্ভর করুন! (এছাড়াও, আমি নিশ্চিত নই range
যে এস 3 অবজেক্ট 0 বাইট দীর্ঘ হলে কী আচরণ করবে))
private boolean sanityCheckNewS3Key(String bucket, String key) {
ResponseInputStream<GetObjectResponse> resp = null;
try {
resp = s3client.getObject(GetObjectRequest.builder()
.bucket(bucket)
.key(key)
.range("bytes=0-3")
.build());
}
catch (NoSuchKeyException e) {
return false;
}
catch (AwsServiceException se) {
throw se;
}
finally {
if (resp != null) {
try {
resp.close();
} catch (IOException e) {
log.warn("Exception while attempting to close S3 input stream", e);
}
}
}
return true;
}
}
দ্রষ্টব্য: এই কোডটি ধরে নিয়েছে s3Client
এবং log
ঘোষণা করা হয়েছে এবং অন্য কোথাও শুরু করা হয়েছে। পদ্ধতিটি একটি বুলিয়ান দেয়, তবে ব্যতিক্রম ছুঁড়ে ফেলতে পারে।
s3Client.headObject()
করার জন্য ভি 2-তে রয়েছে: stackoverflow.com/a/56949742/9814131 , এবং আপনি গিথুবS3Exception
ইস্যু অনুসারে অবজেক্টটি উপস্থিত আছে কিনা তা পরীক্ষা করতে 404 এর স্থিতি কোড 404 পরীক্ষা করবেন github.com/aws/aws-sdk- জাভা-ভি 2 / সংখ্যা / 297 । তবে আমার ধারণা আপনারা আরও প্রগতিশীল যেহেতু এটিতে 0-3 বাইটের মতো খুব কম ওভারহেড রয়েছে।
আমি ব্যবহার করার সময়ও এই সমস্যার মুখোমুখি হয়েছি
String BaseFolder = "3patti_Logs";
S3Object object = s3client.getObject(bucketName, BaseFolder);
আমি পেয়েছি ত্রুটি কী পাওয়া যায় নি
আমি যখন আঘাত এবং চেষ্টা
String BaseFolder = "3patti_Logs";
S3Object object = s3client.getObject(bucketName, BaseFolder+"/");
এটি কাজ করেছে, এই কোডটি 1.9 জার দিয়ে কাজ করছে অন্যথায় 1.11 এ আপডেট হবে এবং উপরের মতো বলা হয়েছে doObjectExist ব্যবহার করুন
অন্যদের উল্লেখ করেছি যে, ডেস্কটপ AWS এস 3 জাভা SDK এর 2.10+ জন্য আপনি ব্যবহার করতে পারেন HeadObjectRequest আপনার এস 3 বালতিতে কোনও ফাইল আছে কিনা তা পরীক্ষা করতে অবজেক্টটি । এটি আসলে ফাইল না পেয়ে জিইটি অনুরোধের মতো কাজ করবে।
উদাহরণস্বরূপ কোডগুলি যেহেতু অন্যরা আসলে উপরোক্ত কোনও কোড যুক্ত করেনি:
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) {
//Log exception for debugging
return false;
}
}
headObjectResponse
। throws Exception
পাশাপাশি প্রয়োজন হয় না।
বিকল্পভাবে আপনি মিনিও-জাভা ক্লায়েন্ট লাইব্রেরিটি ব্যবহার করতে পারেন , এটির ওপেন সোর্স এবং এডাব্লুএস এস 3 এপিআইয়ের সাথে সামঞ্জস্যপূর্ণ।
আপনি একই জন্য মিনিও-জাভা স্ট্যাটোবজেক্ট.জভা উদাহরণগুলি ব্যবহার করতে পারেন ।
আমদানি io.minio.MinioClient; আমদানি io.minio.erferences.MinioException; আমদানি করুন java.io.InputStream; আমদানি java.io.IOException; আমদানি করুন java.security.NoSuchAlgorithmException; আমদানি জাভা.সিকিউরিটি.অনুষ্ঠানিককীএক্সসেপশন; আমদানি org.xmlpull.v1.XMLPullParserException; পাবলিক ক্লাস গেটোবজেক্ট { পাবলিক স্ট্যাটিক শূন্য মূল (স্ট্রিং [] আরগস) NoSuchAlgorithmException, IOException, अवैधKeyException, XMLPullParserException, MinioException th নিক্ষেপ করে { // দ্রষ্টব্য: আপনার-অ্যাকসেসকিইআইডি, আপনার সেক্রেটসেস্কেসি এবং আমার-বালতি নামগুলি // ডামি মান, দয়া করে এটিকে মূল মানগুলির সাথে প্রতিস্থাপন করুন। // সেট এস 3 এন্ডপয়েন্ট, অঞ্চলটি স্বয়ংক্রিয়ভাবে গণনা করা হয় MinioClient s3Client = নতুন মিনিওস্লায়েন্ট ("https://s3.amazonaws.com", "আপনার-অ্যাক্সেসকিইআইইডি", "আপনার সেক্রেসিটসিসিএসইইআই"); ইনপুট স্ট্রিম স্ট্রিম = s3Client.getObject ("আমার-বালতি নাম", "আমার-অবজেক্টনাম"); বাইট [] বুফ = নতুন বাইট [16384]; int bytesRead; যখন ((বাইট্রেড = স্ট্রিম.ড্রেড (বুফ, 0, বুফ.লেন্থ))> = 0) System.out.println (নতুন স্ট্রিং (বুফ, 0, বাইট্রেড)); } স্ট্রিম.ক্লোজ (); } }
আমি আসা করি এটা সাহায্য করবে.