全部產品
Search
文件中心

Object Storage Service:資料校正(Go SDK V1)

更新時間:Nov 28, 2025

OSS提供基於MD5和CRC64的資料校正,確保上傳、下載和拷貝檔案(Object)過程中的資料完整性。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見地區和Endpoint

  • 本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證(Go SDK V1)

  • 本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見配置用戶端(Go SDK V1)

MD5校正

當上傳檔案時,如果指定了Content-MD5,OSS將根據接收到的資料重新計算MD5值。若OSS計算出的MD5值與上傳時提供的值不符,將返回 InvalidDigest異常,以此確保資料的完整性和準確性。遇到InvalidDigest異常時,建議檢查檔案是否在傳輸過程中發生改變或損壞,並重新上傳檔案。

說明

putObject、getObject、appendObject、postObject、uploadPart支援MD5校正。

以下代碼用於上傳檔案時進行MD5校正:

package main

import (
	"crypto/md5"
	"encoding/base64"
	"log"
	"strings"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// 計算給定內容的MD5校正碼
func calculateMD5(content string) string {
	h := md5.New()
	h.Write([]byte(content))
	return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

func main() {
	// 從環境變數中載入OSS訪問憑證
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// 替換為實際的Bucket名稱
	bucketName := "yourBucketName"

	// 建立OSS用戶端
	// 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)
	}

	// 擷取指定的Bucket
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket %s: %v", bucketName, err)
	}

	// 要上傳的內容
	content := "yourObjectValue"   // 替換為實際要上傳的內容
	objectName := "yourObjectName" // 替換為實際的對象名稱

	// 計算內容的MD5校正碼
	contentMD5 := calculateMD5(content)

	// 上傳檔案到OSS
	err = bucket.PutObject(objectName, strings.NewReader(content), oss.ContentMD5(contentMD5))
	if err != nil {
		log.Fatalf("Failed to upload object %s: %v", objectName, err)
	}

	log.Printf("Object '%s' uploaded successfully.", objectName)
}

CRC64校正

說明

CRC64 校正注意事項:

  • putObject、getObject、appendObject、uploadPart支援CRC64校正。

  • 上傳、下載和拷貝檔案時,預設啟用 CRC 資料校正。如果用戶端計算的 CRC 值與服務端返回的 CRC 值不一致,將返回錯誤。

  • 範圍下載不支援 CRC64 校正。

  • 啟用 CRC64 校正會佔用一定的 CPU 資源,對上傳、下載速度均會有影響。

以下代碼用於追加上傳檔案時進行CRC64資料完整性校正:

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名稱
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket %s: %v", bucketName, err)
	}

	// 定義要追加的Object名稱
	objectName := "yourObjectName" // 替換為實際的Object名稱

	// 第一次追加的位置是0,傳回值為下一次追加的位置。後續追加的位置是追加前檔案的長度。
	request := &oss.AppendObjectRequest{
		ObjectKey: objectName,
		Reader:    strings.NewReader("YourObjectAppendValue1"),
		Position:  0,
	}

	// 第一次追加時,初始化crc的值為0。
	options := []oss.Option{oss.InitCRC(0)}
	result, err := bucket.DoAppendObject(request, options)
	if err != nil {
		log.Fatalf("Failed to append object %s for the first time: %v", objectName, err)
	}
	log.Printf("First append successful. Next position: %d", result.NextPosition)

	// 第二次追加的位置從第一次的返回長度開始。
	request = &oss.AppendObjectRequest{
		ObjectKey: objectName,
		Reader:    strings.NewReader("YourObjectAppendValue2"),
		Position:  result.NextPosition,
	}

	// 第二次追加的初始化crc值為第一次傳回值。
	options = []oss.Option{oss.InitCRC(result.CRC)}
	result, err = bucket.DoAppendObject(request, options)
	if err != nil {
		log.Fatalf("Failed to append object %s for the second time: %v", objectName, err)
	}
	log.Printf("Second append successful. Next position: %d", result.NextPosition)

	// 您可以進行多次AppendObject操作。
	log.Printf("All appends completed successfully.")
}