預設情況下,如果新添加檔案與現有檔案(Object)同名且對該檔案有存取權限,則新添加的檔案將覆蓋原有的檔案。本文介紹如何通過佈建要求頭x-oss-forbid-overwrite在簡單上傳、拷貝檔案及分區上傳等情境中禁止覆蓋同名檔案。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
範例程式碼
以下代碼用於簡單上傳時禁止覆蓋同名檔案:
package main
import (
"log"
"strings"
"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 {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// yourBucketName填寫儲存空間名稱。
bucketName := "yourBucketName"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 指定是否覆蓋同名檔案。
// 不指定oss.ForbidOverWrite時,預設覆蓋同名Object。
// 指定oss.ForbidOverWrite為false時,表示允許覆蓋同名Object。
// 指定oss.ForbidOverWrite為true時,表示禁止覆蓋同名Object,如果同名Object已存在,程式將報錯。
forbidWrite := oss.ForbidOverWrite(true)
// 上傳字串。
// yourObjectName填寫不包含Bucket名稱在內的Object的完整路徑。
objectName := "yourObjectName"
objectValue := "yourObjectValue"
err = bucket.PutObject(objectName, strings.NewReader(objectValue), forbidWrite)
if err != nil {
log.Fatalf("Failed to upload object '%s': %v", objectName, err)
}
log.Printf("Successfully uploaded object '%s' with value '%s'", objectName, objectValue)
}
常見使用情境
拷貝檔案時禁止覆蓋同名檔案
分區上傳時禁止覆蓋同名檔案
相關文檔
關於簡單上傳的API介面說明,請參見PutObject。
關於拷貝檔案的API介面說明,請參見CopyObject。
關於分區上傳的API介面說明,請參見InitiateMultipartUpload以及CompleteMultipartUpload。