doukan5332 2019-06-12 14:38
浏览 157

AWS S3-如何递归删除对象[GoLang]

I would like to delete all .JPEG files from specified path at S3 bucket. For example, lets say that I have structure on S3 cloud service similar to following:

Obj1/
   Obj2/
      Obj3/
         image_1.jpeg
         ...
         image_N.jpeg

Is it possible to specify Obj1/Obj2/Obj3 as DeleteObjectsInput's prefix and recursively delete all .JPEG files that contain such prefix.

Here is my code:

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 represents Obj1/Obj2/Obj3 path from example above. As a result of this function I do not get any error. I actually get the following message:

Deleted: [{
      Key: "Obj1/Obj2/Obj3"
    }]

But when I check my S3 cloud service, nothing is done. What am I doing wrong?

EDIT

I've changed my code so my Delete function accepts list of objects from which I make a list of s3.ObjectIdentifier. There is roughly 50 .JPEG files in that list, and for some reason following code ONLY DELETES LAST ONE. I am not sure why.

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
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
    • ¥20 关于URL获取的参数,无法执行二选一查询
    • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
    • ¥15 marlin编译错误,如何解决?
    • ¥15 有偿四位数,节约算法和扫描算法
    • ¥15 VUE项目怎么运行,系统打不开
    • ¥50 pointpillars等目标检测算法怎么融合注意力机制
    • ¥20 Vs code Mac系统 PHP Debug调试环境配置
    • ¥60 大一项目课,微信小程序
    • ¥15 求视频摘要youtube和ovp数据集