我想.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 云服务时,什么也没做。我究竟做错了什么?
编辑
我已经更改了我的代码,因此我的 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
}