前言
TOS提供两种上传方式,简单上传跟分片上传,简单上传方式最大能够上传5GB的文件,所以如果对象大小超过5GB,可以使用分片上传实现。
使用分片上传,您可以将对象分成多个数据块(Part)分别上传,每个分片都是对象数据的连续部分。您可以独立上传以及按任意顺序上传这些对象分片。如果其中任意分片上传失败,可以重新进行上传且不影响其他分片。上传完所有分片后,汇集所有分片并创建元数据。
分片上传优势:
- 提高吞吐量 - 您可以并行上传分段以提高吞吐量。
- 从网络问题中快速恢复 - 使用分片,可以将因网络问题导致的上传失败影响降至最低。
- 暂停和恢复上传 - 您可以在一段时间内分别上传对象的分片。启用分片后,不存在过期期限;您需要显示完成或停止分片上传。
分片上传流程:
- 初始化分片上传
- 上传分片
- 分片上传完成
关于实验
- 预计部署时间:20分钟
- 级别:初级
- 相关产品:TOS
- 受众: 通用
实验说明
实验步骤
一、安装Go SDK 您可以使用如下命令安装Go SDK。
go get -u https://github.com/volcengine/ve-tos-golang-sdk
二、代码实现
本示例代码主要为使用分片上传超过5GB的对象,使用TOS Go SDK完成,并未使用多线程。
示例代码如下:
package main
import (
"bufio"
"bytes"
"context"
"fmt"
"github.com/volcengine/ve-tos-golang-sdk/tos"
"io"
"os"
)
var(
endpoint = "tos-cn-beijing.volces.com"
accessKey = "xxxxxxxx"//替换为您的AK
secretKey = "xxxxxxxx"//替换为您的SK
region = "cn-beijing"
)
func check(err error, message string) {
if err != nil {
fmt.Printf("%s err: %s\n", message, err.Error())
os.Exit(1)
}
}
func main(){
// 初始化客户端
client, err := tos.NewClient(endpoint, tos.WithRegion(region),
tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
check(err,"NewClient")
handle, err := client.Bucket("wanyix-support")
check(err,"Bucket")
// 分片上传
//定义上传对象的文件名
key := "Windows7.iso"
//初始化分片上传
upload, err := handle.CreateMultipartUpload(context.Background(), key)
check(err,"CreateMultiupload")
// 指定本地文件路径
filepath := "/Users/bytedance/Downloads/Windows 7.iso"
fi,err := os.Open(filepath)
if err != nil{
fmt.Println(err.Error())
panic(err)
}
defer fi.Close()
// 使用bufio进行读取
reader := bufio.NewReader(fi)
//创建一个1G的buf,可根据您自己系统配置进行调整,如调整为100MB
buf := make([]byte,1073741824)
var a []tos.MultipartUploadedPart
i := 1
for {
n, err := reader.Read(buf)
fmt.Println(n)
if err != nil && err != io.EOF {
panic(err)
}
if 0 == n{
break
}
fmt.Println("读完成")
part, err := handle.UploadPart(context.Background(), &tos.UploadPartInput{
Key: key,
UploadID: upload.UploadID,
PartSize: int64(n),
PartNumber: i,
Content: bytes.NewReader(buf),
})
if err !=nil{
panic(err)
}
fmt.Println(i)
i = i + 1
fmt.Println("上传完成")
a = append(a, part)
}
_, err = handle.CompleteMultipartUpload(context.Background(), &tos.CompleteMultipartUploadInput{
Key: key,
UploadID: upload.UploadID,
UploadedParts: a,
})
check(err,"CompleteMultipartUpload")
}
程序执行后,您可以在TOS控制台-对应桶-文件列表-分片管理,查看目前正在进行的分片任务,包括文件名称、上传ID、创建时间。
上传完成后,控制台显示如下:
参考文档: [1] TOS Go SDK