All Products
Search
Document Center

Object Storage Service:Cegah objek dengan nama yang sama agar tidak ditimpa (Go SDK V1)

Last Updated:Nov 29, 2025

Secara default, objek baru akan menimpa objek yang sudah ada dengan nama yang sama jika Anda memiliki izin akses yang diperlukan. Topik ini menjelaskan cara mencegah perilaku tersebut dengan mengatur header permintaan x-oss-forbid-overwrite untuk unggah simple, salinan objek, dan unggah multi-bagian.

Catatan penggunaan

  • Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya yang berada di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • Kredensial akses pada topik ini diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

  • Instans OSSClient pada topik ini dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Konfigurasi klien (Go SDK V1).

Kode contoh

Kode berikut menunjukkan cara mencegah objek dengan nama yang sama agar tidak ditimpa selama unggah simple:

package main

import (
	"log"
	"strings"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, 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.
	// Atur yourEndpoint ke titik akhir wilayah bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir yang sesuai.
	// Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sesuai.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Atur versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Atur yourBucketName ke nama bucket.
	bucketName := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
	}

	// Tentukan apakah objek dengan nama yang sama boleh ditimpa.
	// Jika Anda tidak menentukan oss.ForbidOverWrite, objek dengan nama yang sama akan ditimpa secara default.
	// Jika Anda mengatur oss.ForbidOverWrite ke false, objek dengan nama yang sama akan ditimpa.
	// Jika Anda mengatur oss.ForbidOverWrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
	forbidWrite := oss.ForbidOverWrite(true)

	// Unggah string.
	// Atur yourObjectName ke path lengkap objek. Jangan sertakan nama bucket dalam path lengkap tersebut.
	objectName := "yourObjectName"
	objectValue := "yourObjectValue"
	err = bucket.PutObject(objectName, strings.NewReader(objectValue), forbidWrite)
	if err != nil {
		log.Fatalf("Gagal mengunggah objek '%s': %v", objectName, err)
	}

	log.Printf("Berhasil mengunggah objek '%s' dengan nilai '%s'", objectName, objectValue)
}

Skema umum

Cegah objek agar tidak ditimpa saat menyalinnya

Kode contoh berikut menunjukkan cara mencegah objek yang disalin agar tidak menimpa objek yang sudah ada dengan nama yang sama:

package main

import (
	"log"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, 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.
	// Atur yourEndpoint ke titik akhir wilayah bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir yang sesuai.
	// Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sesuai.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Atur versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Atur yourBucketName ke nama bucket.
	bucketName := "yourBucketName"
	// Atur yourObjectName ke path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap tersebut.
	objectName := "yourObjectName"
	// Atur yourDestObjectName ke path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap tersebut.
	destObjectName := "yourDestObjectName"

	// Dapatkan instans bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
	}

	// Tentukan apakah objek tujuan dengan nama yang sama boleh ditimpa.
	// Jika Anda tidak menentukan oss.ForbidOverWrite, objek tujuan dengan nama yang sama akan ditimpa secara default.
	// Jika Anda mengatur oss.ForbidOverWrite ke false, objek tujuan dengan nama yang sama akan ditimpa.
	// Jika Anda mengatur oss.ForbidOverWrite ke true, objek tujuan dengan nama yang sama tidak akan ditimpa. Jika objek tujuan dengan nama yang sama sudah ada, program akan melaporkan error.
	forbidWrite := oss.ForbidOverWrite(true)

	// Salin objek ke objek lain dalam bucket yang sama.
	_, err = bucket.CopyObject(objectName, destObjectName, forbidWrite)
	if err != nil {
		log.Fatalf("Gagal menyalin objek dari '%s' ke '%s': %v", objectName, destObjectName, err)
	}

	log.Printf("Berhasil menyalin objek dari '%s' ke '%s'", objectName, destObjectName)
}

Cegah objek agar tidak ditimpa selama unggah multi-bagian

Kode contoh berikut menunjukkan cara mencegah objek agar tidak ditimpa selama unggah multi-bagian:

package main

import (
	"log"
	"os"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, 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.
	// Atur yourEndpoint ke titik akhir wilayah bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir yang sesuai.
	// Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sesuai.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Atur versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat klien OSS: %v", err)
	}

	// Atur yourBucketName ke nama bucket.
	bucketName := "yourBucketName"
	// Atur yourObjectName ke path lengkap objek. Jangan sertakan nama bucket dalam path lengkap tersebut.
	objectName := "yourObjectName"
	// Atur yourLocalFilename ke path lengkap file lokal.
	localFilename := "yourLocalFilename"

	// Dapatkan instans bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket '%s': %v", bucketName, err)
	}

	// Pemisahan file menjadi beberapa bagian.
	chunks, err := oss.SplitFileByPartNum(localFilename, 3)
	if err != nil {
		log.Fatalf("Gagal memisahkan file: %v", err)
	}

	// Buka file lokal.
	fd, err := os.Open(localFilename)
	if err != nil {
		log.Fatalf("Gagal membuka file lokal '%s': %v", localFilename, err)
	}
	defer fd.Close()

	// Tentukan apakah objek dengan nama yang sama boleh ditimpa.
	// Jika Anda tidak menentukan oss.ForbidOverWrite, objek dengan nama yang sama akan ditimpa secara default.
	// Jika Anda mengatur oss.ForbidOverWrite ke false, objek dengan nama yang sama akan ditimpa.
	// Jika Anda mengatur oss.ForbidOverWrite ke true, objek dengan nama yang sama tidak akan ditimpa. Jika objek dengan nama yang sama sudah ada, program akan melaporkan error.
	forbidWrite := oss.ForbidOverWrite(true)

	// Langkah 1: Mulai event unggah multi-bagian.
	imur, err := bucket.InitiateMultipartUpload(objectName, forbidWrite)
	if err != nil {
		log.Fatalf("Gagal memulai unggah multi-bagian untuk '%s': %v", objectName, err)
	}

	// Langkah 2: Unggah bagian-bagian.
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		fd.Seek(chunk.Offset, os.SEEK_SET)
		// Panggil metode UploadPart untuk mengunggah setiap bagian.
		part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
		if err != nil {
			log.Fatalf("Gagal mengunggah bagian %d dari '%s': %v", chunk.Number, objectName, err)
		}
		parts = append(parts, part)
	}

	// Langkah 3: Selesaikan unggah multi-bagian dan cegah objek agar tidak ditimpa.
	cmur, err := bucket.CompleteMultipartUpload(imur, parts, forbidWrite)
	if err != nil {
		log.Fatalf("Gagal menyelesaikan unggah multi-bagian untuk '%s': %v", objectName, err)
	}

	log.Printf("Unggah multi-bagian berhasil diselesaikan untuk '%s'. cmur: %v", objectName, cmur)
}

Referensi