1

我想.JPEG从 S3 存储桶的指定路径中删除所有文件。例如,假设我在 S3 云服务上具有类似于以下的结构:

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

是否可以指定Obj1/Obj2/Obj3DeleteObjectsInput'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
}
4

0 回答 0