对于开启了版本控制的Bucket,OSS支持根据是否传入versionId控制对象(Object)被临时删除或是彻底删除。您可以结合这个特性对单个、多个或者指定前缀的Object进行删除操作。
注意事项
本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证。
本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化。
要删除文件,您必须有
oss:DeleteObject
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
版本控制下的删除行为
版本控制下的删除行为说明如下:
未指定versionId(临时删除):
如果在未指定versionId的情况下执行删除操作时,默认不会删除Object的当前版本,而是对当前版本插入删除标记(Delete Marker)。当执行GetObject操作时,OSS会检测到当前版本为删除标记,并返回
404 Not Found
。此外,响应中会返回header:x-oss-delete-marker = true
以及新生成的删除标记的版本号x-oss-version-id
。x-oss-delete-marker
的值为true,表示与返回的x-oss-version-id
对应的版本为删除标记。关于临时删除文件后如何恢复文件的更多信息,请参见恢复文件。
指定versionId(彻底删除):
如果在指定versionId的情况下执行删除操作时,OSS会根据
params
中指定的versionId
参数彻底删除该版本。如果要删除ID为“null”的版本,请在params
参数中添加params['versionId'] = “null”
。
删除单个文件
以下提供了彻底删除及临时删除单个Object的示例。
指定versionId删除Object
以下代码用于指定versionId对Object进行彻底删除:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 创建OSSClient实例。 // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。 client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourBucketName填写存储空间名称。 bucket, err := client.Bucket("yourBucketName") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // youObjectName填写不包含Bucket名称在内的Object的完整路径。 // yourObjectVersionId填写Object的versionId。指定后,将彻底删除该versionId的Object。 err = bucket.DeleteObject("youObjectName", oss.VersionId("yourObjectVersionId")) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } }
不指定versionId删除Object
以下代码用于不指定versionId对Object进行临时删除:
package main import ( "fmt" "net/http" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 创建OSSClient实例。 // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。 client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourBucketName填写存储空间名称。 bucket, err := client.Bucket("yourBucketName") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } var retHeader http.Header // 不指定versionId对Object进行临时删除,此操作将会为Object添加删除标记。 // youObjectName填写不包含Bucket名称在内的Object的完整路径。 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)) }
删除多个文件
以下提供了彻底删除以及临时删除多个Object或删除标记的示例。
指定versionId删除多个Object
以下代码用于指定versionId对多个Object进行彻底删除:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 创建OSSClient实例。 // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。 client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourBucketName填写存储空间名称。 bucket, err := client.Bucket("yourBucketName") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 指定需彻底删除Object的versionId。 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" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 创建OSSClient实例。 // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。 client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourBucketName填写存储空间名称。 bucket, err := client.Bucket("yourBucketName") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 指定删除标记的版本信息。 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) } }
不指定versionID删除多个Object
以下代码用于不指定versionId对多个Object进行临时删除:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 创建OSSClient实例。 // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。 client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // yourBucketName填写存储空间名称。 bucket, err := client.Bucket("yourBucketName") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 不指定versionId对多个Object进行临时删除,此操作会为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) } }
删除指定前缀(prefix)的文件
以下代码用于彻底删除指定前缀的文件:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
/// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填写存储空间名称。
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")
}
相关文档
关于删除单个文件的API接口说明,请参见DeleteObject。
关于删除多个文件的API接口说明,请参见DeleteMultipleObjects。