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.")
}