本文針對檔案的傳輸情境,介紹如何使用Go SDK V2新增的下載管理員Downloader模組進行檔案下載。
注意事項
本文範例程式碼以華東1(杭州)的地區ID
cn-hangzhou為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱。本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
要進行檔案下載,您必須有
oss:GetObject許可權。具體操作,請參見為RAM使用者授予自訂的權限原則。
方法定義
下載管理員功能簡介
Go SDK V2新增下載管理員Downloader提供了通用的下載介面,隱藏了底層介面的實現細節,提供便捷的檔案下載能力。
下載管理員Downloader底層利用範圍下載,把檔案自動分成多個較小的分區進行並發下載,提升下載的效能。
下載管理員Downloader同時提供了斷點續傳的能力,即在下載過程中,記錄已完成的分區狀態,如果出現網路中斷、程式異常退出等問題導致檔案下載失敗,甚至重試多次仍無法完成下載,再次下載時,可以通過斷點記錄檔案恢複下載。
下載管理員Downloader的常用方法如下:
type Downloader struct {
...
}
// 用於建立新的下載管理員
func (c *Client) NewDownloader(optFns ...func(*DownloaderOptions)) *Downloader
// 用於下載檔案
func (d *Downloader) DownloadFile(ctx context.Context, request *GetObjectRequest, filePath string, optFns ...func(*DownloaderOptions)) (result *DownloadResult, err error)請求參數列表
參數名 | 類型 | 說明 |
ctx | context.Context | 請求的上下文,可以用來佈建要求的總時限 |
request | *GetObjectRequest | 設定具體介面的請求參數,具體請參見GetObjectRequest |
filePath | string | 本地檔案路徑 |
optFns | ...func(*DownloaderOptions) | (可選)配置選項 |
其中,DownloaderOption常用參數說明列舉如下:
參數名 | 類型 | 說明 |
PartSize | int64 | 指定分區大小,預設值為 6MiB |
ParallelNum | int | 指定下載任務的並發數,預設值為 3。針對的是單次調用的並發限制,而不是全域的並發限制 |
EnableCheckpoint | bool | 是否記錄斷點下載資訊,預設不記錄 |
CheckpointDir | string | 指定記錄檔案的儲存路徑,例如 /local/dir/, 當EnableCheckpoint 為 true時有效 |
VerifyData | bool | 恢複下載時,是否要校正已下載資料的CRC64值,預設不校正, 當EnableCheckpoint 為 true時有效 |
UseTempFile | bool | 下載檔案時,是否使用臨時檔案,預設使用。先下載到 臨時檔案上,當成功後,再重新命名為目標檔案 |
當使用NewDownloader執行個體化執行個體時,您可以指定多個配置選項來自訂對象的下載行為。也可以在每次調用下載介面時,指定多個配置選項來自訂每次下載對象的行為。
設定Downloader的配置參數:
d := client.NewDownloader(func(do *oss.DownloaderOptions) { do.PartSize = 10 * 1024 * 1024 })設定每次下載請求的配置參數:
request := &oss.GetObjectRequest{Bucket: oss.Ptr("bucket"), Key: oss.Ptr("key")} d.DownloadFile(context.TODO(), request, "/local/dir/example", func(do *oss.DownloaderOptions) { do.PartSize = 10 * 1024 * 1024 })
範例程式碼
您可以使用以下代碼將儲存空間中的檔案下載到本地。
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 // 儲存地區
bucketName string // 儲存空間名稱
objectName string // 對象名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "src-object", "", "The name of the source object.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 檢查來源物件名稱是否為空白
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, src object name required")
}
// 配置OSS用戶端
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立下載器
d := client.NewDownloader()
// 構建擷取對象的請求
request := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
Key: oss.Ptr(objectName), // 對象名稱
}
// 定義本地檔案路徑
localFile := "local-file"
// 執行下載檔案的請求
result, err := d.DownloadFile(context.TODO(), request, localFile)
if err != nil {
log.Fatalf("failed to download file %v", err)
}
// 列印下載成功的資訊
log.Printf("download file %s to local-file successfully, size: %d", objectName, result.Written)
}
常見使用情境
相關文檔
關於下載管理員的更多資訊,請參見開發人員指南。
關於檔案下載的API介面,請參見DownloadFile。