Untuk bucket yang telah diaktifkan fitur versioning, OSS mendukung soft delete dan permanent delete untuk objek. Jenis penghapusan tergantung pada apakah Anda menentukan versionId. Fitur ini memungkinkan Anda menghapus satu objek, beberapa objek, atau objek yang memiliki awalan tertentu.
Catatan penggunaan
Pada topik ini, titik akhir publik wilayah China (Hangzhou) digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya tentang wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.
Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan kredensial akses.
Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Konfigurasikan client (Go SDK V1).
Untuk menghapus objek, Anda harus memiliki izin
oss:DeleteObject. Untuk informasi selengkapnya, lihat Berikan kebijakan akses kustom kepada RAM user.
Perilaku penghapusan dengan versioning
Bagian ini menjelaskan perilaku penghapusan objek ketika versioning diaktifkan.
Jika Anda tidak menentukan versionId (soft delete):
Jika Anda melakukan operasi penghapusan tanpa menentukan versionId, versi saat ini dari objek tidak dihapus. Sebagai gantinya, OSS menyisipkan penanda hapus untuk versi tersebut. Saat Anda melakukan operasi GetObject, OSS mendeteksi bahwa versi saat ini adalah penanda hapus dan mengembalikan
404 Not Found. Tanggapan tersebut juga mencakup headerx-oss-delete-marker = truedan nomor versi penanda hapus baru dalamx-oss-version-id.Nilai true untuk
x-oss-delete-markermenunjukkan bahwa versi yang sesuai denganx-oss-version-idyang dikembalikan merupakan penanda hapus.Untuk informasi selengkapnya tentang cara memulihkan objek yang telah di-soft delete, lihat Pulihkan objek.
Jika Anda menentukan versionId (permanent delete):
Jika Anda menentukan versionId selama operasi penghapusan, OSS akan menghapus secara permanen versi yang sesuai dengan parameter
versionIddalamparams. Untuk menghapus versi dengan ID "null", tambahkanparams['versionId'] = "null"ke parameterparams.
Kode contoh
Hapus satu file
Contoh kode berikut menunjukkan cara menghapus secara permanen dan soft delete satu objek.
Hapus objek dengan menentukan versionId
Kode berikut menunjukkan cara menghapus objek secara permanen dengan menentukan versionId:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke Titik Akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Titik Akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Titik Akhir sesuai kebutuhan.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayah sesuai kebutuhan.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat client OSS: %v", err)
}
// Setel yourBucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Setel youObjectName ke path lengkap objek. Jangan sertakan nama bucket.
// Setel yourObjectVersionId ke versionId objek. Setelah Anda menentukan versionId, objek versi tersebut akan dihapus secara permanen.
objectName := "yourObjectName"
objectVersionId := "yourObjectVersionId"
err = bucket.DeleteObject(objectName, oss.VersionId(objectVersionId))
if err != nil {
log.Fatalf("Gagal menghapus objek '%s' dengan ID versi '%s': %v", objectName, objectVersionId, err)
}
log.Println("Objek berhasil dihapus.")
}
Hapus objek tanpa menentukan versionId
Kode berikut menunjukkan cara melakukan soft delete objek tanpa menentukan versionId:
package main
import (
"log"
"net/http"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke Titik Akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Titik Akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Titik Akhir sesuai kebutuhan.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayah sesuai kebutuhan.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat client OSS: %v", err)
}
// Setel yourBucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Lakukan soft delete objek tanpa menentukan versionId. Operasi ini menambahkan penanda hapus ke objek.
// Setel youObjectName ke path lengkap objek. Jangan sertakan nama bucket.
objectName := "yourObjectName"
var retHeader http.Header
err = bucket.DeleteObject(objectName, oss.GetResponseHeader(&retHeader))
if err != nil {
log.Fatalf("Gagal menghapus objek '%s': %v", objectName, err)
}
// Cetak informasi penanda hapus.
log.Printf("x-oss-version-id: %s", oss.GetVersionId(retHeader))
log.Printf("x-oss-delete-marker: %t", oss.GetDeleteMark(retHeader))
log.Println("Objek berhasil dihapus.")
}
Hapus beberapa file
Contoh kode berikut menunjukkan cara menghapus secara permanen dan soft delete beberapa objek atau penanda hapus.
Hapus permanen beberapa objek dengan menentukan versionId
Kode berikut menunjukkan cara menghapus permanen beberapa objek dengan menentukan versionId masing-masing:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke Titik Akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Titik Akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Titik Akhir sesuai kebutuhan.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayah sesuai kebutuhan.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat client OSS: %v", err)
}
// Setel yourBucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Tentukan versionId objek yang akan dihapus secara permanen.
keyArray := []oss.DeleteObject{
{Key: "objectName1", VersionId: "objectVersionId1"},
{Key: "objectName2", VersionId: "objectVersionId2"},
}
// Hapus versi objek yang ditentukan.
ret, err := bucket.DeleteObjectVersions(keyArray)
if err != nil {
log.Fatalf("Gagal menghapus objek: %v", err)
}
// Cetak informasi objek yang telah dihapus.
for _, object := range ret.DeletedObjectsDetail {
log.Printf("Key: %s, VersionId: %s", object.Key, object.VersionId)
}
log.Println("Objek berhasil dihapus.")
}
Hapus permanen beberapa penanda hapus dengan menentukan versionId
Kode berikut menunjukkan cara menghapus permanen beberapa penanda hapus dengan menentukan versionId masing-masing:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke Titik Akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Titik Akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Titik Akhir sesuai kebutuhan.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayah sesuai kebutuhan.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat client OSS: %v", err)
}
// Setel yourBucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Tentukan informasi versi penanda hapus.
keyArray := []oss.DeleteObject{
{Key: "objectName1", VersionId: "objectVersionId1"},
{Key: "objectName2", VersionId: "objectVersionId2"},
}
// Hapus permanen beberapa penanda hapus dengan menentukan versionId masing-masing.
ret, err := bucket.DeleteObjectVersions(keyArray)
if err != nil {
log.Fatalf("Gagal menghapus objek: %v", err)
}
// Cetak informasi objek dan penanda hapus yang telah dihapus.
for _, object := range ret.DeletedObjectsDetail {
log.Printf("Key: %s, VersionId: %s, DeleteMarker: %t, DeleteMarkerVersionId: %s",
object.Key, object.VersionId, object.DeleteMarker, object.DeleteMarkerVersionId)
}
log.Println("Objek berhasil dihapus.")
}
Soft delete beberapa objek tanpa menentukan versionId
Kode berikut menunjukkan cara melakukan soft delete beberapa objek tanpa menentukan versionId masing-masing:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke Titik Akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Titik Akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, sesuaikan Titik Akhir sesuai kebutuhan.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, sesuaikan wilayah sesuai kebutuhan.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Gagal membuat client OSS: %v", err)
}
// Setel yourBucketName ke nama bucket.
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
}
// Lakukan soft delete beberapa objek tanpa menentukan versionId masing-masing. Operasi ini menambahkan penanda hapus ke objek.
keyArray := []oss.DeleteObject{
{Key: "objectName1"},
{Key: "objectName2"},
}
// Jalankan operasi penghapusan.
res, err := bucket.DeleteObjectVersions(keyArray)
if err != nil {
log.Fatalf("Gagal menghapus objek: %v", err)
}
// Cetak penanda hapus objek.
for _, object := range res.DeletedObjectsDetail {
log.Printf("Key: %s, DeleteMarker: %t, DeleteMarkerVersionId: %s",
object.Key, object.DeleteMarker, object.DeleteMarkerVersionId)
}
log.Println("Objek berhasil dihapus.")
}
Referensi
Untuk informasi selengkapnya tentang operasi API untuk menghapus satu objek, lihat DeleteObject.
Untuk informasi selengkapnya tentang operasi API untuk menghapus versi tertentu dari objek, lihat DeleteObjectVersions.