本文介紹如何通過簡單下載方法將存儲空間(Bucket)中的文件(Object)下載到本地,此方法操作簡便,適合快速將云端存儲的文件下載到本地。
注意事項
本文示例代碼以華東1(杭州)的地域ID
cn-hangzhou
為例,默認使用外網Endpoint,如果您希望通過與OSS同地域的其他阿里云產品訪問OSS,請使用內網Endpoint。關于OSS支持的Region與Endpoint的對應關系,請參見OSS地域和訪問域名。本文以從環境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
要將文件下載到本地,您必須有
oss:GetObject
權限。具體操作,請參見為RAM用戶授權自定義的權限策略。
方法定義
func (c *Client) GetObject(ctx context.Context, request *GetObjectRequest, optFns ...func(*Options)) (*GetObjectResult, error)
請求參數列表
參數名 | 類型 | 說明 |
ctx | context.Context | 請求的上下文,可以用來設置請求的總時限 |
request | *GetObjectRequest | 設置具體接口的請求參數,具體請參見GetObjectRequest |
optFns | ...func(*Options) | (可選)接口級的配置參數, 具體請參見Options |
返回值列表
返回值名 | 類型 | 說明 |
result | *GetObjectResult | 接口返回值,當 err 為nil 時有效,具體請參見GetObjectResult |
err | error | 請求的狀態,當請求失敗時,err 不為 nil |
示例代碼
您可以使用以下代碼將存儲空間中的文件下載到本地。
package main
import (
"context"
"flag"
"io"
"log"
"os"
"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, "object", "", "The name of the 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")
}
// 檢查object名稱是否為空
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 定義輸出文件路徑
outputFile := "downloaded.file" // 替換為你希望保存的文件路徑
// 加載默認配置并設置憑證提供者和區域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 創建OSS客戶端
client := oss.NewClient(cfg)
// 創建獲取對象的請求
request := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // 存儲空間名稱
Key: oss.Ptr(objectName), // 對象名稱
}
// 執行獲取對象的操作并處理結果
result, err := client.GetObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get object %v", err)
}
defer result.Body.Close() // 確保在函數結束時關閉響應體
// 一次性讀取整個文件內容
data, err := io.ReadAll(result.Body)
if err != nil {
log.Fatalf("failed to read object %v", err)
}
// 將內容寫入到文件
err = os.WriteFile(outputFile, data, 0644)
if err != nil {
log.Fatalf("failed to write to output file %v", err)
}
log.Printf("file downloaded successfully to %s", outputFile)
}
常見使用場景
根據限定條件下載
當從Bucket中下載單個文件(Object)時,您可以指定基于文件最后修改時間或ETag(文件內容標識符)的條件限制。只有當這些條件得到滿足時才會執行下載操作;如果不滿足,則會返回錯誤并且不會觸發下載。利用限定條件下載不僅可以減少不必要的網絡傳輸和資源消耗,還能提高下載效率。
OSS支持的限定條件如下:
If-Modified-Since和If-Unmodified-Since可以同時存在。If-Match和If-None-Match也可以同時存在。
您可以通過ossClient.getObjectMeta方法獲取ETag。
參數 | 描述 |
IfModifiedSince | 如果指定的時間早于實際修改時間,則正常傳輸文件,否則返回錯誤(304 Not modified)。 |
IfUnmodifiedSince | 如果指定的時間等于或者晚于文件實際修改時間,則正常傳輸文件,否則返回錯誤(412 Precondition failed)。 |
IfMatch | 如果指定的ETag和OSS文件的ETag匹配,則正常傳輸文件,否則返回錯誤(412 Precondition failed)。 |
IfNoneMatch | 如果指定的ETag和OSS文件的ETag不匹配,則正常傳輸文件,否則返回錯誤(304 Not modified)。 |
以下示例代碼展示了如何使用限定條件下載。
package main
import (
"context"
"flag"
"log"
"net/http"
"time"
"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, "object", "", "The name of the 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")
}
// 檢查object名稱是否為空
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 加載默認配置并設置憑證提供者和區域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 創建OSS客戶端
client := oss.NewClient(cfg)
// 指定本地文件路徑
localFile := "download.file"
// 假設Object最后修改時間為2024年10月21日18:43:02,則填寫的UTC早于該時間時,將滿足IfModifiedSince的限定條件,并觸發下載行為。
date := time.Date(2024, time.October, 21, 18, 43, 2, 0, time.UTC)
// 假設ETag為e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,則填寫的ETag與Object的ETag值相等時,將滿足IfMatch的限定條件,并觸發下載行為。
etag := "\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\""
// 創建下載對象到本地文件的請求
getRequest := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // 存儲空間名稱
Key: oss.Ptr(objectName), // 對象名稱
IfModifiedSince: oss.Ptr(date.Format(http.TimeFormat)), // 指定IfModifiedSince參數
IfMatch: oss.Ptr(etag), // 指定IfMatch參數
}
// 執行下載對象到本地文件的操作并處理結果
result, err := client.GetObjectToFile(context.TODO(), getRequest, localFile)
if err != nil {
log.Fatalf("failed to get object to file %v", err)
}
log.Printf("get object to file result:%#v\n", result)
}
打印下載文件的進度條
當您在下載文件時,可以使用進度條實時了解下載進度,避免因為等待時間過長而感到不安或懷疑任務是否卡住。
以下示例代碼展示了如何使用進度條查看下載文件的進度。
package main
import (
"context"
"flag"
"fmt"
"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, "object", "", "The name of the 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")
}
// 檢查object名稱是否為空
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 加載默認配置并設置憑證提供者和區域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 創建OSS客戶端
client := oss.NewClient(cfg)
// 指定本地文件路徑
localFile := "download.file"
// 創建下載對象到本地文件的請求
getRequest := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // 存儲空間名稱
Key: oss.Ptr(objectName), // 對象名稱
ProgressFn: func(increment, transferred, total int64) {
fmt.Printf("increment:%v, transferred:%v, total:%v\n", increment, transferred, total)
}, //進度回調函數,顯示下載進度
}
// 執行下載對象到本地文件的操作并處理結果
result, err := client.GetObjectToFile(context.TODO(), getRequest, localFile)
if err != nil {
log.Fatalf("failed to get object to file %v", err)
}
log.Printf("get object to file result:%#v\n", result)
}
相關文檔
關于下載到本地文件的完整示例代碼,請參見GitHub示例。
關于下載到本地文件的API接口說明,請參見GetObjectToFile和GetObject。