Client是OSS的Go客戶端,用于管理存儲空間和文件等OSS資源。使用Go SDK發起OSS請求時,您需要初始化一個Client實例,并根據需要修改默認配置項。
前提條件
初始化OSS SDK前,您需要配置訪問憑證。詳情請參見配置訪問憑證。
新建Client
V4簽名(推薦)
推薦使用更安全的V4簽名算法。使用V4簽名初始化時,除指定Endpoint以外,您還需要指定阿里云通用Region ID作為發起請求地域的標識,示例值為cn-hangzhou
。同時聲明oss.AuthV4。OSS Go SDK 3.0.2及以上版本支持V4簽名。
以使用OSS域名初始化時使用V4簽名為例,其他通過自定義域名等初始化的場景可參考以下示例執行相應修改。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于處理不可恢復的錯誤,并記錄錯誤信息后終止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient 用于設置并創建OSS客戶端實例。
// 參數:
//
// endpoint - Bucket對應的Endpoint。
// region - Endpoint對應的Region信息。
//
// 返回創建的OSS客戶端實例。
func setupClient(endpoint, region string) (*oss.Client, error) {
// 從環境變量中獲取訪問憑證。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// 創建OSSClient實例,并使用V4簽名。
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region(region))
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
endpoint := "yourEndpoint"
// yourRegion填寫Endpoint對應的Region信息,例如cn-hangzhou。
region := "yourRegion"
// 檢查環境變量是否已經設置。
if endpoint == "" || region == "" {
log.Fatal("Please set yourEndpoint and yourRegion.")
}
// 設置并創建OSS客戶端實例。
client, err := setupClient(endpoint, region)
if err != nil {
handleError(err)
}
// 輸出客戶端信息。
log.Printf("Client: %#v\n", client)
}
V1簽名(不推薦)
阿里云對象存儲OSS自2025年03月01日起不再對新用戶(即新UID )開放使用V1簽名,并將于2025年09月01日起停止更新與維護且不再對新增Bucket開放使用V1簽名。請盡快切換到V4簽名,避免影響服務。更多信息,請參見公告說明。
使用OSS域名新建Client
以下代碼用于使用OSS域名初始化。關于不同地域的OSS域名,請參見OSS地域和訪問域名。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于處理不可恢復的錯誤,并記錄錯誤信息后終止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient 用于設置并創建OSS客戶端實例。
// 參數:
//
// endpoint - Bucket對應的Endpoint。
//
// 返回創建的OSS客戶端實例。
func setupClient(endpoint string) (*oss.Client, error) {
// 從環境變量中獲取訪問憑證。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// 創建OSSClient實例。
// 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(endpoint, "", "", clientOptions...)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
endpoint := "yourEndpoint"
// 檢查環境變量是否已經設置。
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// 設置并創建OSS客戶端實例。
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// 輸出客戶端信息。
log.Printf("Client: %#v\n", client)
}
使用自定義域名新建Client
以下代碼用于使用自定義域名新建Client。關于使用自定義域名訪問OSS的更多信息,請參見綁定自定義域名至Bucket默認域名。
使用自定義域名時無法使用ossClient.listBuckets方法。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于處理不可恢復的錯誤,并記錄錯誤信息后終止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient 用于設置并創建OSS客戶端實例,支持CNAME。
// 參數:
//
// endpoint - 自定義域名,即綁定到存儲空間的自定義域名。
//
// 返回創建的OSS客戶端實例。
func setupClient(endpoint string) (*oss.Client, error) {
// 從環境變量中獲取訪問憑證。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// 創建OSSClient實例,并啟用CNAME支持。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
clientOptions = append(clientOptions, oss.UseCname(true))
// 設置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New(endpoint, "", "", clientOptions...)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// yourEndpoint填寫Bucket對應的自定義域名。
// 示例:填寫為 "custom-domain-for-your-bucket.com"。
endpoint := "yourEndpoint"
// 檢查環境變量是否已經設置。
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// 設置并創建OSS客戶端實例,支持CNAME。
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// 輸出客戶端信息。
log.Printf("Client: %#v\n", client)
}
配置Client
您可以通過Client配置代理、連接超時、最大連接數等參數。
參數 | 描述 | 方法 |
MaxIdleConns | 最大閑置連接數。默認值為100。 | oss.MaxConns |
MaxIdleConnsPerHost | 每個主機的最大閑置連接數。默認值為100。 | oss.MaxConns |
MaxConnsPerHost | 每個主機的最大連接數。默認為空。 | oss.MaxConns |
ConnectTimeout | HTTP超時時間,單位為秒。默認值為10秒,0表示不超時。 | oss.Timeout |
ReadWriteTimeout | HTTP讀取或寫入超時時間,單位為秒。默認值為20秒,0表示不超時。 | oss.Timeout |
IsCname | 是否支持將自定義域名作為Endpoint,默認不支持。 | oss.UseCname |
UserAgent | 設置HTTP的User-Agent頭,默認值為aliyun-sdk-go。 | oss.UserAgent |
ProxyHost | 是否開啟代理服務器主機地址和端口。取值如下:
| oss.AuthProxy |
ProxyUser | 代理服務器驗證的用戶名。 | oss.AuthProxy |
ProxyPassword | 代理服務器驗證的密碼。 | oss.AuthProxy |
RedirectEnabled | 設置是否開啟HTTP重定向。取值如下:
| oss.RedirectEnabled |
InsecureSkipVerify | 設置是否開啟SSL證書校驗。取值如下:
| oss.InsecureSkipVerify |
IsEnableCRC | 是否開啟CRC數據校驗。取值如下:
| oss.EnableCRC |
LogLevel | 設置日志模式。取值如下:
| oss.SetLogLevel |
配置示例如下:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于處理不可恢復的錯誤,并記錄錯誤信息后終止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// setupClient 用于設置并創建OSS客戶端實例。
// 參數:
//
// endpoint - Bucket對應的Endpoint。
//
// 返回創建的OSS客戶端實例。
func setupClient(endpoint string) (*oss.Client, error) {
// 從環境變量中獲取訪問憑證。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return nil, err
}
// 設置連接數為10,每個主機的最大閑置連接數為20,每個主機的最大連接數為20。
conn := oss.MaxConns(10, 20, 20)
// 設置HTTP連接超時時間為20秒,HTTP讀取或寫入超時時間為60秒。
time := oss.Timeout(20, 60)
// 設置是否支持將自定義域名作為Endpoint,默認不支持。
cname := oss.UseCname(true)
// 設置HTTP的User-Agent頭,默認為aliyun-sdk-go。
userAgent := oss.UserAgent("aliyun-sdk-go")
// 設置是否開啟HTTP重定向,默認開啟。
redirect := oss.RedirectEnabled(true)
// 設置是否開啟SSL證書校驗,默認忽略。
verifySsl := oss.InsecureSkipVerify(false)
// 設置代理服務器地址和端口。
// proxy := oss.Proxy("yourProxyHost")
// 設置代理服務器的主機地址和端口,代理服務器驗證的用戶名和密碼。
authProxy := oss.AuthProxy("yourProxyHost", "yourProxyUserName", "yourProxyPassword")
// 開啟CRC加密。
crc := oss.EnableCRC(true)
// 設置日志模式。
logLevel := oss.SetLogLevel(oss.LogOff)
// 創建OSSClient實例。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.Region("yourRegion"), oss.AuthVersion(oss.AuthV4),
conn, time, cname, userAgent, authProxy, verifySsl, redirect, crc, logLevel)
if err != nil {
return nil, err
}
return client, nil
}
func main() {
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
endpoint := "yourEndpoint"
// 檢查環境變量是否已經設置。
if endpoint == "" {
log.Fatal("Please set yourEndpoint.")
}
// 設置并創建OSS客戶端實例。
client, err := setupClient(endpoint)
if err != nil {
handleError(err)
}
// 輸出客戶端信息。
log.Printf("Client: %#v\n", client)
}
設置請求上下文
您可以通過請求上下文控制和管理請求的生命周期,以及傳遞請求相關的上下文信息。
以下代碼用于設置請求上下文。僅OSS Go SDK 2.2.9及以上版本支持設置請求上下文。
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// handleError 用于處理不可恢復的錯誤,并記錄錯誤信息后終止程序。
func handleError(err error) {
log.Fatalf("Error: %v", err)
}
// uploadFile 用于將本地文件上傳到OSS存儲桶。
// 參數:
//
// bucketName - 存儲空間名稱。
// objectName - Object完整路徑,完整路徑中不包含Bucket名稱。
// localFileName - 本地文件的完整路徑。
// endpoint - Bucket對應的Endpoint。
//
// 如果成功,記錄成功日志;否則,返回錯誤。
func uploadFile(bucketName, objectName, localFileName, endpoint string) error {
// 從環境變量中獲取訪問憑證。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
return err
}
// 創建OSSClient實例。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider), oss.Region("yourRegion"), oss.AuthVersion(oss.AuthV4))
if err != nil {
return err
}
// 獲取存儲空間。
bucket, err := client.Bucket(bucketName)
if err != nil {
return err
}
// 設置請求上下文。
ctx := context.Background()
// 指定請求上下文過期時間。
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// 將本地文件上傳至OSS。
err = bucket.PutObjectFromFile(objectName, localFileName, oss.WithContext(ctx))
if err != nil {
select {
case <-ctx.Done():
return fmt.Errorf("Request cancelled or timed out")
default:
return err
}
}
// 文件上傳成功后,記錄日志。
log.Printf("File uploaded successfully: %s/%s", bucketName, objectName)
return nil
}
func main() {
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
endpoint := "yourEndpoint"
// 填寫存儲空間名稱,例如examplebucket。
bucketName := "examplebucket"
// yourObjectName填寫Object完整路徑,完整路徑中不包含Bucket名稱。
objectName := "yourObjectName"
// yourLocalFile填寫本地文件的完整路徑。
localFileName := "yourLocalFile"
// 檢查環境變量是否已經設置。
if endpoint == "" || bucketName == "" || objectName == "" || localFileName == "" {
log.Fatal("Please set yourEndpoint, bucketName, objectName, and localFileName.")
}
// 嘗試上傳文件,如果失敗則處理錯誤。
if err := uploadFile(bucketName, objectName, localFileName, endpoint); err != nil {
handleError(err)
}
// 輸出上傳成功的消息。
log.Println("Upload Success!")
}