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

使用Go SDK 将大文件分片上传至TOS

最近更新时间2024.01.03 10:39:55

首次发布时间2022.01.12 13:58:59

本文介绍使用GO SDK 将大文件进行分片上传至 TOS。

前言

TOS提供两种上传方式,简单上传跟分片上传,简单上传方式最大能够上传5GB的文件,所以如果对象大小超过5GB,可以使用分片上传实现。

使用分片上传,您可以将对象分成多个数据块(Part)分别上传,每个分片都是对象数据的连续部分。您可以独立上传以及按任意顺序上传这些对象分片。如果其中任意分片上传失败,可以重新进行上传且不影响其他分片。上传完所有分片后,汇集所有分片并创建元数据。

分片上传优势:

  • 提高吞吐量 - 您可以并行上传分段以提高吞吐量。
  • 从网络问题中快速恢复 - 使用分片,可以将因网络问题导致的上传失败影响降至最低。
  • 暂停和恢复上传 - 您可以在一段时间内分别上传对象的分片。启用分片后,不存在过期期限;您需要显示完成或停止分片上传。

分片上传流程:

  • 初始化分片上传
  • 上传分片
  • 分片上传完成
关于实验
  • 预计部署时间:20分钟
  • 级别:初级
  • 相关产品:TOS
  • 受众: 通用
实验说明
  • 点击此链接登录控制台。

  • 如果您还没有账户,请点击此链接注册账户。

实验步骤

一、安装Go SDK
您可以使用如下命令安装Go SDK。

go get -u https://github.com/volcengine/ve-tos-golang-sdk

二、代码实现

本示例代码主要为使用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、创建时间。

上传完成后,控制台显示如下:
alt

参考文档:
[1] TOS Go SDK