Go拷貝對(duì)象
本文介紹如何使用Go SDK V2的CopyObject方法,將源Bucket中的對(duì)象(5GiB 以下)拷貝到同一地域下相同或不同目標(biāo)Bucket中。
注意事項(xiàng)
本文示例代碼以華東1(杭州)的地域ID
cn-hangzhou
為例,默認(rèn)使用外網(wǎng)Endpoint,如果您希望通過(guò)與OSS同地域的其他阿里云產(chǎn)品訪問(wèn)OSS,請(qǐng)使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對(duì)應(yīng)關(guān)系,請(qǐng)參見(jiàn)OSS地域和訪問(wèn)域名。本文以從環(huán)境變量讀取訪問(wèn)憑證為例。如何配置訪問(wèn)憑證,請(qǐng)參見(jiàn)配置訪問(wèn)憑證。
要進(jìn)行拷貝文件,您必須擁有源文件的讀權(quán)限及目標(biāo)Bucket的讀寫(xiě)權(quán)限。
不支持跨地域拷貝。例如不能將華東1(杭州)地域存儲(chǔ)空間中的文件拷貝到華北1(青島)地域。
拷貝文件時(shí),您需要確保源Bucket和目標(biāo)Bucket均未設(shè)置合規(guī)保留策略,否則報(bào)錯(cuò)The object you specified is immutable.。
方法定義
func (c *Client) CopyObject(ctx context.Context, request *CopyObjectRequest, optFns ...func(*Options)) (*CopyObjectResult, error)
請(qǐng)求參數(shù)列表
參數(shù)名 | 類(lèi)型 | 說(shuō)明 |
ctx | context.Context | 請(qǐng)求的上下文,可以用來(lái)設(shè)置請(qǐng)求的總時(shí)限 |
request | *CopyObjectRequest | 設(shè)置具體接口的請(qǐng)求參數(shù),具體請(qǐng)參見(jiàn)CopyObjectRequest |
optFns | ...func(*Options) | (可選)配置選項(xiàng),具體請(qǐng)參見(jiàn)Options |
其中,CopyObjectRequest的常用參數(shù)列舉如下:
參數(shù)名 | 類(lèi)型 | 說(shuō)明 |
Bucket | *string | 指定目標(biāo)存儲(chǔ)空間名稱(chēng) |
Key | *string | 指定目標(biāo)對(duì)象名稱(chēng) |
SourceBucket | *string | 指定源存儲(chǔ)空間名稱(chēng) |
SourceKey | *string | 指定源對(duì)象名稱(chēng) |
ForbidOverwrite | *string | 指定CopyObject操作時(shí)是否覆蓋同名目標(biāo)Object |
Tagging | *string | 指定Object的對(duì)象標(biāo)簽,可同時(shí)設(shè)置多個(gè)標(biāo)簽,例如TagA=A&TagB=B。 |
TaggingDirective | *string | 指定如何設(shè)置目標(biāo)Object的對(duì)象標(biāo)簽。取值如下:
|
返回值列表
返回值名 | 類(lèi)型 | 說(shuō)明 |
result | *CopyObjectResult | 接口返回值,當(dāng) err 為nil 時(shí)有效,具體請(qǐng)參見(jiàn)CopyObjectResult |
err | error | 請(qǐng)求的狀態(tài),當(dāng)請(qǐng)求失敗時(shí),err 不為 nil |
示例代碼
您可以使用以下代碼將小于5GiB的對(duì)象從源存儲(chǔ)空間拷貝到目標(biāo)存儲(chǔ)空間。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全局變量
var (
region string // 存儲(chǔ)區(qū)域
srcBucketName string // 源存儲(chǔ)空間名稱(chēng)
srcObjectName string // 源對(duì)象名稱(chēng)
destBucketName string // 目標(biāo)存儲(chǔ)空間名稱(chēng)
destObjectName string // 目標(biāo)對(duì)象名稱(chēng)
)
// init函數(shù)用于初始化命令行參數(shù)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}
func main() {
// 解析命令行參數(shù)
flag.Parse()
// 檢查源bucket名稱(chēng)是否為空
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source bucket name required")
}
// 檢查region是否為空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 如果目標(biāo)bucket名稱(chēng)未指定,則使用源bucket名稱(chēng)
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// 檢查源object名稱(chēng)是否為空
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source object name required")
}
// 檢查目標(biāo)object名稱(chēng)是否為空
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, destination object name required")
}
// 加載默認(rèn)配置并設(shè)置憑證提供者和區(qū)域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 創(chuàng)建OSS客戶(hù)端
client := oss.NewClient(cfg)
// 創(chuàng)建復(fù)制對(duì)象請(qǐng)求
request := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 目標(biāo)存儲(chǔ)空間名稱(chēng)
Key: oss.Ptr(destObjectName), // 目標(biāo)對(duì)象名稱(chēng)
SourceKey: oss.Ptr(srcObjectName), // 源對(duì)象名稱(chēng)
SourceBucket: oss.Ptr(srcBucketName), // 源存儲(chǔ)空間名稱(chēng)
}
// 執(zhí)行復(fù)制對(duì)象操作并處理結(jié)果
result, err := client.CopyObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to copy object %v", err)
}
log.Printf("copy object result:%#v\n", result)
}
相關(guān)文檔
關(guān)于拷貝對(duì)象的完整示例代碼,請(qǐng)參見(jiàn)GitHub示例。
關(guān)于拷貝對(duì)象的API接口,請(qǐng)參見(jiàn)CopyObject。