You need to enable JavaScript to run this app.
导航

上传资源

最近更新时间2024.02.07 11:43:45

首次发布时间2024.02.07 11:43:45

阅读本文,您可以获取 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)来同时分片上传,最后将所有上传的分片合并为一个文件并获取存储地址。分片上传最大能够上传 48.8TB 文件,其中除了最后一个分片,其他分片大小需大于等于 5MB 且小于 5GB。分片数量默认从 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())
}