Я хотел бы удалить все .JPEG
файлы по указанному пути в сегменте S3. Например, предположим, что у меня есть структура в облачном сервисе S3, похожая на следующую:
Obj1/
Obj2/
Obj3/
image_1.jpeg
...
image_N.jpeg
Можно ли указать Obj1/Obj2/Obj3
как DeleteObjectsInput's
prefix
и рекурсивно удалить все .JPEG
файлы, содержащие такие prefix
.
Вот мой код:
func (s3Obj S3) Delete() error {
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(s3Obj.Region),
}))
svc := s3.New(sess)
input := &s3.DeleteObjectsInput{
Bucket: aws.String(s3Obj.Bucket),
Delete: &s3.Delete{
Objects: []*s3.ObjectIdentifier{
{
Key: aws.String(s3Obj.ItemPath),
},
},
Quiet: aws.Bool(false),
},
}
result, err := svc.DeleteObjects(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
default:
glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", aerr.Error())
}
} else {
glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", err.Error())
}
return err
}
glog.Info(result)
return nil
}
sObj3.ItemPath
представляет Obj1/Obj2/Obj3
путь из примера выше. В результате этой функции я не получаю никакой ошибки. На самом деле я получаю следующее сообщение:
Deleted: [{
Key: "Obj1/Obj2/Obj3"
}]
Но когда я проверяю свой облачный сервис S3, ничего не делается. Что я делаю не так?
EDIT
Я изменил свой код, поэтому моя функция Delete принимает список объектов, из которых я составляю список s3.ObjectIdentifier
. В этом списке примерно 50 файлов .JPEG, и по какой-то причине следующий код ТОЛЬКО УДАЛЯЕТ ПОСЛЕДНИЙ . Я не уверен почему.
func (s3Obj S3) Delete(objects []string) error {
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(s3Obj.Region),
}))
svc := s3.New(sess)
var objKeys = make([]*s3.ObjectIdentifier, len(objects))
for i, v := range objects {
glog.Info("About to delete: ", v)
objKeys[i] = &s3.ObjectIdentifier{
Key: &v,
}
}
input := &s3.DeleteObjectsInput{
Bucket: aws.String(s3Obj.Bucket),
Delete: &s3.Delete{
Objects: objKeys,
Quiet: aws.Bool(false),
},
}
result, err := svc.DeleteObjects(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
default:
glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", aerr.Error())
}
} else {
glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", err.Error())
}
return err
}
glog.Info(result)
return nil
}