# baidubce-sdk-go **Repository Path**: guoyao/baidubce-sdk-go ## Basic Information - **Project Name**: baidubce-sdk-go - **Description**: Unofficial Go SDK for Baidu Cloud Engine - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-01-15 - **Last Updated**: 2021-10-25 ## Categories & Tags **Categories**: web-dev-toolkits **Tags**: None ## README # baidubce-sdk-go Unofficial Go SDK for [Baidu Cloud Engine](https://cloud.baidu.com/)(support go 1.3+) [![Build Status](https://api.travis-ci.org/guoyao/baidubce-sdk-go.png?branch=master)](http://travis-ci.org/guoyao/baidubce-sdk-go) [![codecov](https://codecov.io/gh/guoyao/baidubce-sdk-go/branch/master/graph/badge.svg)](https://codecov.io/gh/guoyao/baidubce-sdk-go) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) ## Package Structure * bos: [Baidu Object Storage](https://cloud.baidu.com/doc/BOS/API.html) [![GoDoc](https://godoc.org/github.com/guoyao/baidubce-sdk-go/bos?status.svg)](https://godoc.org/github.com/guoyao/baidubce-sdk-go/bos) * bce: Common library of Baidubce Go SDK [![GoDoc](https://godoc.org/github.com/guoyao/baidubce-sdk-go/bce?status.svg)](https://godoc.org/github.com/guoyao/baidubce-sdk-go/bce) * util: Utility helpers [![GoDoc](https://godoc.org/github.com/guoyao/baidubce-sdk-go/util?status.svg)](https://godoc.org/github.com/guoyao/baidubce-sdk-go/util) ## Install ``` go get github.com/guoyao/baidubce-sdk-go/... ``` ## Run Test Before run test, you should setup two environment variables: `BAIDU_BCE_AK` and `BAIDU_BCE_SK` ``` go test -v github.com/guoyao/baidubce-sdk-go/... ``` ## Usage ```go import ( "github.com/guoyao/baidubce-sdk-go/bce" "github.com/guoyao/baidubce-sdk-go/bos" "github.com/guoyao/baidubce-sdk-go/util" ) var credentials = bce.NewCredentials("AK", "SK") var bceConfig = bce.NewConfig(credentials) var bosConfig = bos.NewConfig(bceConfig) var bosClient = bos.NewClient(bosConfig) ``` ### CreateBucket ```go func CreateBucket() { bucketName := "baidubce-sdk-go" err := bosClient.CreateBucket(bucketName, nil) if err != nil { log.Println(err) } else { err := bosClient.DeleteBucket(bucketName, nil) if err != nil { log.Println(err) } } } ``` ### PutObject ```go func PutObject() { /*------------------ put object from string --------------------*/ bucketName := "baidubce-sdk-go" objectKey := "examples/put-object-from-string.txt" str := "Hello World 你好" option := new(bce.SignOption) metadata := new(bos.ObjectMetadata) metadata.AddUserMetadata("x-bce-meta-name", "guoyao") putObjectResponse, err := bosClient.PutObject(bucketName, objectKey, str, metadata, option) if err != nil { log.Println(err) } else { fmt.Println(putObjectResponse.GetETag()) } /*------------------ put object from bytes --------------------*/ objectKey = "examples/put-object-from-bytes" byteArray := make([]byte, 1024, 1024) putObjectResponse, err = bosClient.PutObject(bucketName, objectKey, byteArray, nil, nil) if err != nil { log.Println(err) } else { fmt.Println(putObjectResponse.GetETag()) } /*------------------ put object from file --------------------*/ file, err := util.TempFileWithSize(1024) defer func() { if file != nil { file.Close() os.Remove(file.Name()) } }() if err != nil { log.Fatal(err) } objectKey = "examples/put-object-from-file" if err != nil { log.Println(err) } else { putObjectResponse, err = bosClient.PutObject(bucketName, objectKey, file, nil, nil) if err != nil { log.Println(err) } else { fmt.Println(putObjectResponse.GetETag()) } } } ``` ### MultipartUpload ```go func MultipartUpload() { bucketName := "baidubce-sdk-go" objectKey := "examples/test-multipart-upload" initiateMultipartUploadRequest := bos.InitiateMultipartUploadRequest{ BucketName: bucketName, ObjectKey: objectKey, } initiateMultipartUploadResponse, err := bosClient.InitiateMultipartUpload(initiateMultipartUploadRequest, nil) if err != nil { panic(err) } uploadId := initiateMultipartUploadResponse.UploadId files := make([]*os.File, 0) file, err := util.TempFileWithSize(1024 * 1024 * 6) files = append(files, file) if err != nil { log.Fatal(err) } defer func() { for _, f := range files { f.Close() os.Remove(f.Name()) } }() fileInfo, err := file.Stat() if err != nil { log.Fatal(err) } var partSize int64 = 1024 * 1024 * 5 var totalSize int64 = fileInfo.Size() var partCount int = int(math.Ceil(float64(totalSize) / float64(partSize))) parts := make([]bos.PartSummary, 0, partCount) for i := 0; i < partCount; i++ { var skipBytes int64 = partSize * int64(i) var size int64 = int64(math.Min(float64(totalSize-skipBytes), float64(partSize))) tempFile, err := util.TempFile(nil, "", "") files = append(files, tempFile) if err != nil { panic(err) } limitReader := io.LimitReader(file, size) _, err = io.Copy(tempFile, limitReader) if err != nil { panic(err) } partNumber := i + 1 uploadPartRequest := bos.UploadPartRequest{ BucketName: bucketName, ObjectKey: objectKey, UploadId: uploadId, PartSize: size, PartNumber: partNumber, PartData: tempFile, } parts = append(parts, bos.PartSummary{PartNumber: partNumber}) uploadPartResponse, err := bosClient.UploadPart(uploadPartRequest, nil) if err != nil { panic(err) } parts[partNumber-1].ETag = uploadPartResponse.GetETag() } completeMultipartUploadRequest := bos.CompleteMultipartUploadRequest{ BucketName: bucketName, ObjectKey: objectKey, UploadId: uploadId, Parts: parts, } completeMultipartUploadResponse, err := bosClient.CompleteMultipartUpload( completeMultipartUploadRequest, nil) if err != nil { panic(err) } fmt.Println(completeMultipartUploadResponse.ETag) } ``` ### MultipartUploadFromFile ```go func MultipartUploadFromFile() { bucketName := "baidubce-sdk-go" objectKey := "examples/test-multipart-upload-from-file" file, err := util.TempFileWithSize(1024 * 1024 * 10) defer func() { if file != nil { file.Close() os.Remove(file.Name()) } }() if err != nil { log.Fatal(err) } var partSize int64 = 1024 * 1024 * 2 completeMultipartUploadResponse, err := bosClient.MultipartUploadFromFile(bucketName, objectKey, file.Name(), partSize) if err != nil { log.Println(err) } else { fmt.Println(completeMultipartUploadResponse.ETag) } } ``` ### GetSessionToken ```go func GetSessionToken() { req := bce.SessionTokenRequest{ DurationSeconds: 600, Id: "ef5a4b19192f4931adcf0e12f82795e2", AccessControlList: []bce.AccessControlListItem{ bce.AccessControlListItem{ Service: "bce:bos", Region: "bj", Effect: "Allow", Resource: []string{"baidubce-sdk-go/*"}, Permission: []string{"READ"}, }, }, } sessionTokenResponse, err := bceClient.GetSessionToken(req, nil) if err != nil { log.Println(err) } else { fmt.Println(sessionTokenResponse) } } ``` ### putObjectBySTS ```go func putObjectBySTS() { bucketName := "baidubce-sdk-go" objectKey := "examples/put-object-from-string.txt" str := "Hello World 你好" req := bce.SessionTokenRequest{ DurationSeconds: 600, Id: "ef5a4b19192f4931adcf0e12f82795e2", AccessControlList: []bce.AccessControlListItem{ bce.AccessControlListItem{ Service: "bce:bos", Region: "bj", Effect: "Allow", Resource: []string{bucketName + "/*"}, Permission: []string{"READ", "WRITE"}, }, }, } sessionTokenResponse, err := bosClient.GetSessionToken(req, nil) if err != nil { log.Println(err) } else { option := &bce.SignOption{ Credentials: bce.NewCredentials(sessionTokenResponse.AccessKeyId, sessionTokenResponse.SecretAccessKey), Headers: map[string]string{"x-bce-security-token": sessionTokenResponse.SessionToken}, } putObjectResponse, err := bosClient.PutObject(bucketName, objectKey, str, nil, option) if err != nil { log.Println(err) } else { fmt.Println(putObjectResponse.GetETag()) } } } ``` ### Others More api usages please refer * [bos/client_test.go](bos/client_test.go) * [baidubce-sdk-go-examples](https://github.com/guoyao/baidubce-sdk-go-examples) ## Authors **Guoyao Wu** + [https://guoyao.me](https://guoyao.me) + [https://github.com/guoyao](https://github.com/guoyao)