Удаление файлов, каталогов и ведер в amazon s3 java
Мне интересно, как это сделать. Я посмотрел документацию на sdk и привел несколько примеров, но я смущен тем, как обычно идет синтаксис.
Если я хочу удалить файл, я предполагаю, что использую deleteObject(path, key)
. Однако, что такое "ключ"?
Также как вы удаляете каталог? Я не могу найти способ для этого.
Ответы
Ответ 1
"Ключ" в S3 похож на путь к файлу:
http://bucket.s3.amazonaws.com/some/path/to/use
... находится в корзине с именем bucket
и имеет ключ some/path/to/use
.
Это на самом деле не путь, потому что нет папок. Ключ S3 - это просто имя файла для файла в одном большом каталоге (весь сегмент). Ключи S3 могут содержать /
, но это не имеет особого значения, если только вы не установите аргумент delimiter
с перечислением сегмента.
Другими словами, наличие объекта с именем some/object
ничего не говорит вам об объекте some
(он может существовать или не существовать - эти два объекта не связаны).
Однако вы можете запросить ключи с определенным префиксом, поэтому я мог бы сказать "дайте мне все ключи, начинающиеся с some/path/to/
и он вернет some/path/to/use
. Это выглядит как" перечисление каталога ", но это действительно просто запрос файлов, которые начинаются с определенной строки символов.
Я мог бы так же легко назвать такие вещи:
somepathtousea
somepathtouseb
И сказать "дай мне все, начиная с somepathtouse
" (и это будет сказать somepathtousea
и somepathtouseb
).
Примечание. URL-адрес S3 представлен в нескольких формах:
http://s3.amazonaws.com/bucket/key
http://bucket.s3.amazonaws.com/key
http://bucket/key (where bucket is a DNS CNAME record pointing to bucket.s3.amazonaws.com)
РЕДАКТИРОВАТЬ:
Я посмотрел на JavaDocs, и вот подпись функции, которую я вижу (для AmazonS3Client
):
public void deleteObject(java.lang.String bucketName,
java.lang.String key)
throws AmazonClientException,
AmazonServiceException
РЕДАКТИРОВАТЬ снова:
Папки действительно существуют как объекты нулевой длины с типом содержимого application/x-directory
и ключом, оканчивающимся на /
:
$ AWS_PROFILE=prod aws s3api head-object --bucket example-bucket --key example-directory/
{
"AcceptRanges": "bytes",
"LastModified": "Mon, 29 Apr 2019 14:59:36 GMT",
"ContentLength": 0,
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"ContentType": "application/x-directory",
"ServerSideEncryption": "AES256",
"Metadata": {}
}
Это все еще просто соглашение, и ничто не мешает вам иметь файлы, заканчивающиеся /
или файлы внутри "папок", которые не существуют.
Ответ 2
Этот фрагмент кода работает для меня. folderPath - это нечто вроде "topDir/secondDir/"
void deleteObjectsInFolder(String bucketName, String folderPath) {
for (S3ObjectSummary file : s3.listObjects(bucketName, folderPath).getObjectSummaries()){
s3.deleteObject(bucketName, file.getKey());
}
}
Ответ 3
Возможно, вы захотите взглянуть на этот пример для быстрой справки о том, как вы можете удалять объекты с S3.
Синтаксис delete
на самом деле
deleteObject( bucketName, key )
где bucketName - это ведро, в которое вы поместили ваши файлы, а ключ - имя файла, который вы хотите удалить в ведре.
Подумайте о ведро, как ваш жесткий диск, например C: \, D:\и т.д. И введите абсолютный путь к файлу, который вы хотите удалить.
Ответ 4
/* Вот решение, которое работает для меня. Здесь Bucket_Name - это мое имя ведра на S3, а ключ - это путь под Bucket_Name. Итак, если абсолютный путь на S3:
s3://my_bucket/путь/к/моей папке /
тогда приведенный ниже код должен работать. */
String Bucket_Name = "my_bucket";
String key = "Path/to/my/folder";
ObjectListing objects = s3Client.listObjects(BUCKET_NAME, key);
for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
{
s3Client.deleteObject(BUCKET_NAME, objectSummary.getKey());
}
Ответ 5
Работает для меня, остерегайтесь усечения!
long start = System.currentTimeMillis();
long totalSize = 0;
int totalItems = 0;
String key ="path/to/folder/"
String bucket = "my-bucket"
final ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(key);
ObjectListing objects = s3.listObjects(listObjectsRequest);
do {
for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
totalSize += objectSummary.getSize();
totalItems++;
s3.deleteObject(bucketName, objectSummary.getKey());
}
objects = s3.listNextBatchOfObjects(objects);
} while (objects.isTruncated());
long stop = System.currentTimeMillis();
LOG.trace("User {} had {} items with {} Kb, took {} ms to delete", user.getName(), totalItems, totalSize / 1024, stop
- start);
Ответ 6
ListObjectsV2Result работал для меня. Попробуй один раз.
private void deleteObjectsInFolder() {
try {
ListObjectsV2Result result;
do {
String folderPath = " ";
result = s3.listObjectsV2(Constants.BUCKET_NAME, folderPath);
Log.e("count:", result.getKeyCount() + "");
if (result.getKeyCount() != 0) {
for (S3ObjectSummary objectSummary :
result.getObjectSummaries()) {
s3.deleteObject(Constants.BUCKET_NAME, objectSummary.getKey());
}
}
System.out.println("Next Continuation Token : " + result.getNextContinuationToken());
} while (result.isTruncated() == true);
} catch (AmazonServiceException ase) {
System.out.println("Caught an AmazonServiceException, " +
"which means your request made it " +
"to Amazon S3, but was rejected with an error response " +
"for some reason.");
System.out.println("Error Message: " + ase.getMessage());
System.out.println("HTTP Status Code: " + ase.getStatusCode());
System.out.println("AWS Error Code: " + ase.getErrorCode());
System.out.println("Error Type: " + ase.getErrorType());
System.out.println("Request ID: " + ase.getRequestId());
} catch (AmazonClientException ace) {
System.out.println("Caught an AmazonClientException, " +
"which means the client encountered " +
"an internal error while trying to communicate" +
" with S3, " +
"such as not being able to access the network.");
System.out.println("Error Message: " + ace.getMessage());
}
}
Ответ 7
Удаление списка объектов из корзины S3 по группам:
public void deleteObjects(String bucketName, List<String> keys) {
List<KeyVersion> bulk = new ArrayList<>();
for (int i = 0; i < keys.size(); i++) {
bulk.add(new KeyVersion(keys.get(i)));
if (i % 100 == 0) {
try {
s3Client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(bulk));
} catch (Exception e) {
System.err.println(e.getErrorMessage());
}
bulk.clear();
}
}
if (bulk.size() > 0) {
try {
s3Client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(bulk));
} catch (Exception e) {
System.err.println(e.getErrorMessage());
}
}
}
Источник: http://codeflex.co/delete-objects-from-amazon-s3-bucket-using-aws-sdk-for-java/
Ответ 8
Как вопрос спрашивает об удалении файлов, каталогов и ведер в jazа amazon S3, я хотел бы предложить код для удаления непустого ведра S3 (Справочник AWS):
public void deleteBucket(final String bucketName) {
final AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient();
try {
ObjectListing objectListing = s3.listObjects(bucketName);
while (true) {
for (Iterator<?> iterator = objectListing.getObjectSummaries().iterator(); iterator.hasNext(); ) {
S3ObjectSummary summary = (S3ObjectSummary) iterator.next();
s3.deleteObject(bucketName, summary.getKey());
}
if (objectListing.isTruncated()) {
objectListing = s3.listNextBatchOfObjects(objectListing);
} else {
break;
}
}
VersionListing versionListing = s3.listVersions(new ListVersionsRequest().withBucketName(bucketName));
while (true) {
for (Iterator<?> iterator = versionListing.getVersionSummaries().iterator(); iterator.hasNext(); ) {
S3VersionSummary vs = (S3VersionSummary) iterator.next();
s3.deleteVersion(bucketName, vs.getKey(), vs.getVersionId());
}
if (versionListing.isTruncated()) {
versionListing = s3.listNextBatchOfVersions(versionListing);
} else {
break;
}
}
s3.deleteBucket(bucketName);
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}
}
Ответ 9
Эта строка кода работает в моем случае, где keyName
- это имя файла:
s3Client.deleteObject(new DeleteObjectRequest(bucketName, keyName));