本文介绍如何在受版本控制的存储空间(Bucket)中删除文件(Object)。

删除单个文件

对于开启版本控制的Bucket执行DeleteObject操作时,如果未指定versionId ,则保留Object的当前版本,并插入删除标记(Delete Marker)。如果指定versionId,则永久删除该指定版本ID的Object。
说明
  • 未指定versionId

    如果在未指定versionId的情况下执行DeleteObject操作时,默认仅作用于Object的当前版本,但不会直接删除该Object的当前版本,而是插入一个删除标记(Delete Marker),并保留原来的当前版本。当执行GetObject操作时,OSS会检测到当前版本为删除标记,并返回404 Not Found。此外,响应中会返回x-oss-delete-marker的header,其值为true,以及新生成的删除标记的版本号x-oss-version-id。

    x-oss-delete-marker的值为true,表示与返回的x-oss-version-id对应的版本为删除标记。

  • 指定versionId

    如果在指定versionId的情况下调用delete_object接口时,OSS会根据params参数中指定的versionId参数永久删除该版本。如果要删除ID为“null”的版本,则调用delete_object接口时,在params参数中添加 params['versionId'] =“null”,OSS将“null”字符串当成“null”版本的ID号,从而删除版本ID为“null”的Object。

以下提供了永久删除指定版本Object及临时删除Object的示例。

  • 永久删除指定版本Object

    以下代码用于永久删除指定版本的Object:

    package main
    
    import (
      "fmt"
      "net/http"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取一个存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 永久删除指定版本的文件。
      err = bucket.DeleteObject(key, oss.VersionId("yourObjectVersionId"))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }
  • 临时删除Object
    以下代码用于临时删除Object:
    package main
    
    import (
      "fmt"
      "net/http"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 不指定版本信息,暂时删除文件,
      err = bucket.DeleteObject("youObjectName", oss.GetResponseHeader(&retHeader))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 打印删除标记信息。
      fmt.Println("x-oss-version-id:", oss.GetVersionId(retHeader))
      fmt.Println("x-oss-delete-marker:", oss.GetDeleteMark(retHeader))
    }

删除单个文件的详细信息请参见DeleteObject

删除多个文件

在开启版本控制的Bucket中,您可以使用DeleteObjects接口来批量删除Object。在Delete请求中如果没有指定versionId,将插入删除标记。如果指定了versionId,将永久删除该Object的指定版本。

  • 不指定versionID删除多个Object
    以下代码用于不指定versionId删除多个Object:
    package main
    
    import (
      "fmt"
      "net/http"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("yourBucketName")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 未指定versionID删除Object。
      keyArray := []oss.DeleteObject{
        oss.DeleteObject{Key: "objectName1"},
        oss.DeleteObject{Key: "objectName2"},
      }
    
      res, err := bucket.DeleteObjectVersions(keyArray)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      // 打印object的删除标记。
      for _, object := range res.DeletedObjectsDetail {
        fmt.Println("key:", object.Key, "\n DeleteMarker:", object.DeleteMarker, "\nDeleteMarkerVersionId", object.DeleteMarkerVersionId)
      }
    }
  • 指定versionId删除多个Object
    以下代码用于指定versionId删除多个指定版本Object:
    package main
    
    import (
      "fmt"
      "net/http"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("yourBucketName")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 指定版本信息,永久删除object。
      keyArray := []oss.DeleteObject{
        oss.DeleteObject{Key: "objectName1", VersionId:"objectVersionId1"},
        oss.DeleteObject{Key: "objectName2", VersionId:"objectVersionId2"},
      }
    
      // 删除指定版本的object。
      ret, err := bucket.DeleteObjectVersions(keyArray)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      // 打印删除的object。
      for _, object := range ret.DeletedObjectsDetail {
        fmt.Println("Key:", object.Key, "\n VersionId:", object.VersionId)
      }
    }
  • 指定versionId删除多个删除标记
    以下代码用于指定versionId来删除多个删除标记:
    package main
    
    import (
      "fmt"
      "net/http"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("yourBucketName")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 指定object的版本信息。
      keyArray := []oss.DeleteObject{
        oss.DeleteObject{Key: "objectName1", VersionId:"objectVersionId1"},
        oss.DeleteObject{Key: "objectName2", VersionId:"objectVersionId2"},
      }
    
      // 指定versionId来删除删除标记。
      ret, err := bucket.DeleteObjectVersions(keyArray)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      // 打印删除的object以及删除标记。
      for _, object := range ret.DeletedObjectsDetail {
        fmt.Println("key:", object.Key, "\n versionId:", object.VersionId, "\n DeleteMarker:", object.DeleteMarker, "\nDeleteMarkerVersionId", object.DeleteMarkerVersionId)
      }
    }

删除多个文件的详细信息请参见DeleteMultipleObjects

删除指定前缀(prefix)的文件

以下代码用于删除指定前缀的文件:

package main

import (
    "fmt"
    "os"

    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 获取存储空间。
    bucket, err := client.Bucket("<yourBucketName>")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 列举所有包含指定前缀的文件并删除。
    prefix := oss.Prefix("<yourObjectPrefix>")
    marker := oss.KeyMarker("")
    version := oss.VersionIdMarker("")

    for {
        lor, err := bucket.ListObjectVersions(marker, prefix, version)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }

        objects := []oss.DeleteObject{}
        for _, object := range lor.ObjectDeleteMarkers {
            objects = append(objects, oss.DeleteObject{
                Key:       object.Key,
                VersionId: object.VersionId,
            })
        }

        for _, object := range lor.ObjectVersions {
            objects = append(objects, oss.DeleteObject{
                Key:       object.Key,
                VersionId: object.VersionId,
            })
        }

        delRes, err := bucket.DeleteObjectVersions(objects, oss.DeleteObjectsQuiet(true))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }

        if len(delRes.DeletedObjectsDetail) > 0 {
            fmt.Println("these objects deleted failure,", delRes.DeletedObjectsDetail)
            os.Exit(-1)
        }

        prefix = oss.Prefix(lor.Prefix)
        marker = oss.KeyMarker(lor.NextKeyMarker)
        version = oss.VersionIdMarker(lor.NextVersionIdMarker)
        if !lor.IsTruncated {
            break
        }
    }
    fmt.Printf("delete success\n")
}