阅读本文,您可以获取 Go SDK 上传资源的接口调用示例,实现快速开发。
本文提供的接口调用示例均通过 AK 和 SK 初始化实例。
调用接口前,请先完成 Go SDK 的安装及初始化操作。
若服务内已经存在同名文件,且您开启了重名覆盖上传,则新上传文件在上传路径及文件名重复时将覆盖同名旧文件。若未开启重名覆盖上传,则新文件上传失败。
本节为您介绍上传资源各方式的调用示例。
您可以指定服务 ID 和上传文件,来获取上传成功的资源 URI。
该接口内部依次调用了 ApplyImageUpload 和 CommitImageUpload 两个 OpenAPI 来实现完整文件上传能力。
接口调用示例如下所示。
package main import ( "fmt" "os" "github.com/volcengine/volc-sdk-golang/base" imagex "github.com/volcengine/volc-sdk-golang/service/imagex/v2" ) // 上传文件 func main_UploadImages() { // 默认 ImageX 实例为 `cn-north-1`,如果您想使用其他区域的实例,请使用 `imagex.NewInstanceWithRegion(区域名)` 显式指定区域 instance := imagex.DefaultInstance instance.SetCredential(base.Credentials{ AccessKeyID: "ak", SecretAccessKey: "sk", }) params := &imagex.ApplyUploadImageParam{ ServiceId: "service id", // 服务 ID // StoreKeys: []string{"example.jpg"}, // 指定文件存储名 Overwrite: false, //是否进行上传覆盖 } // 读取文件 dat, err := os.ReadFile("image file") if err != nil { fmt.Printf("read file from %s error %v", "", err) os.Exit(-1) } // 上传文件 resp, err := instance.UploadImages(params, [][]byte{dat}) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %v", resp) } }
对大于 20MB 的文件,您可以通过将文件数据分成多个分片(part)来同时分片上传,最后将所有上传的分片合并为一个文件并获取存储地址。每个分片固定为 20 MB,分片数量默认从 1 开始,最大为 10000。
说明
上传顺序不影响最终的合并分片操作。如果其中任意分片上传失败,可以重新进行上传且不影响其他分片。
package main import ( "context" "encoding/json" "fmt" "io" "log" "os" "time" "github.com/volcengine/volc-sdk-golang/base" imagex "github.com/volcengine/volc-sdk-golang/service/imagex/v2" ) // 上传文件 func main_SegmentedUploadImages() { // 默认 ImageX 实例为 `cn-north-1`,如果您想使用其他区域的实例,请使用 `imagex.NewInstanceWithRegion(区域名)` 显式指定区域 instance := imagex.DefaultInstance instance.SetCredential(base.Credentials{ AccessKeyID: "ak", SecretAccessKey: "sk", }) params := &imagex.ApplyUploadImageParam{ ServiceId: "service id", // 服务 ID // StoreKeys: []string{"example.jpg"}, // 指定文件存储名 } files := make([]io.Reader, 0) sizeArr := make([]int64, 0) addFile(params, &files, &sizeArr, "store_key1", "/path/to/file1") addFile(params, &files, &sizeArr, "store_key2", "/path/to/file2") startTime := time.Now() // 上传文件 resp, err := instance.SegmentedUploadImages(context.Background(), params, files, sizeArr) takes := time.Since(startTime) if err != nil { fmt.Printf("error %v\n", err) } else { str, _ := json.Marshal(resp) fmt.Printf("success %s\n", string(str)) } fmt.Printf("%v\n", takes) } func addFile(params *imagex.ApplyUploadImageParam, files *[]io.Reader, sizeArr *[]int64, storeKey string, filePath string) { // 读取文件 file, err := os.Open(filePath) if err != nil { log.Fatal(err) } fileInfo, err := file.Stat() if err != nil { log.Fatal(err) } params.StoreKeys = append(params.StoreKeys, storeKey) *files = append(*files, file) *sizeArr = append(*sizeArr, fileInfo.Size()) }