5、AWS SDK for Go-使用s3manager上传下载文件

5、AWS SDK for Go-使用s3manager上传下载文件

传输管理器

文档地址:传送门
上传和下载管理器可以分解大型对象,以便可以将它们分成多个部分并行传输。这使得恢复中断的传输变得容易。

下载管理器

S3 下载管理器确定文件是否可以拆分为更小的部分并并行下载。您可以自定义并行下载的数量和下载部分的大小。

上传管理器

S3 上传管理器确定文件是否可以拆分为更小的部分并并行上传。您可以自定义并行上传的数量和上传部分的大小。

示例代码

package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
	"os"
)

var (
	accessKey = "xxx"       //""
	secretKey = "xxx" //""
	region    = "oss-cn-beijing"
	endpoint  = "oss-cn-beijing.aliyuncs.com"
)

func main() {
	//只要不修改session,session就可以安全的并发使用。
	sess, err := session.NewSession(&aws.Config{
		Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
		Endpoint:    aws.String(endpoint),
		Region:      aws.String(region),
		//minio:true,oss:false
		S3ForcePathStyle: aws.Bool(false),
		//SDK 支持使用客户端 TLS 证书配置的环境和会话选项,这些证书作为客户端 TLS 握手的一部分发送以进行客户端身份验证。
		//如果使用,则需要 Cert 和 Key 值。如果缺少一个,或者无法加载文件的内容,则会返回一个错误。
		//ClientTLSCert:              nil,
		//ClientTLSKey:               nil,
	})
	if err != nil {
		panic(err)
	}

	svc := s3.New(sess)
	//本地需要存在一个2.jpg文件
	UploadWithClient(svc, "bkt-bj1", "2.jpg")
	DownloadWithClient(svc, "bkt-bj1", "2.jpg")

}

//https://docs.aws.amazon.com/zh_cn/sdk-for-go/v1/developer-guide/sdk-utilities.html
//传输管理器 上传和下载管理器可以分解大型对象,以便可以将它们分成多个部分并行传输。这使得恢复中断的传输变得容易。
//S3 下载管理器确定文件是否可以拆分为更小的部分并并行下载。您可以自定义并行下载的数量和下载部分的大小。
func DownloadWithClient(svc *s3.S3, bucket, key string) {
	download := s3manager.NewDownloaderWithClient(svc, func(d *s3manager.Downloader) {
		d.PartSize = 64 * 1024 * 1024 // 64MB per part
		//d.BufferProvider = s3manager.NewPooledBufferedWriterReadFromProvider(25 * 1024 * 1024)
	})

	f, err := os.Create("d_" + key)
	if err != nil {
		panic(err)
	}
	defer f.Close()
	n, err := download.Download(f, &s3.GetObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
	})
	if err != nil {
		panic(err)
	}
	fmt.Printf("Download.n:%d\n", n)
}

//S3 上传管理器确定文件是否可以拆分为更小的部分并并行上传。您可以自定义并行上传的数量和上传部分的大小。
func UploadWithClient(svc *s3.S3, bucket, key string) {
	uploader := s3manager.NewUploaderWithClient(svc, func(u *s3manager.Uploader) {
		定义将在内存中缓冲25个MiB的策略
		//u.BufferProvider = s3manager.NewBufferedReadSeekerWriteToPool(25 * 1024 * 1024)
		//指定要上传的每个部分的缓冲区大小(以字节为单位)。每个部分的最小大小为 5 MB。 DefaultUploadPartSize
		u.PartSize = 64 * 1024 * 1024 // 每个部分 64MB
		//	指定要并行上传的part数量。 默认为5
		u.Concurrency = s3manager.DefaultUploadConcurrency
	})
	fOpen, err := os.Open(key)
	if err != nil {
		panic(err)
	}
	uploadOutput, err := uploader.Upload(&s3manager.UploadInput{
		Body:   fOpen,
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
	})
	if err != nil {
		if multierr, ok := err.(s3manager.MultiUploadFailure); ok {
			// Process error and its associated uploadID
			fmt.Println("Error:", multierr.Code(), multierr.Message(), multierr.UploadID())
		} else {
			// Process error generically
			fmt.Println("Error:", err.Error())
		}

		return
	}
	fmt.Printf("UploadID:%s\n", uploadOutput.UploadID)
	fmt.Printf("ETag:%s\n", *uploadOutput.ETag)
	fmt.Printf("Location:%s\n", uploadOutput.Location)
}


输出结果

UploadID:
ETag:"43325E9E80CDF868045A4ADD7893B935"
Location:https://bkt-bj1.oss-cn-beijing.aliyuncs.com/2.jpg
Download.n:147526

下载的文件:d_2.jpg如图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InterestingFigure

迈克 Let's Go

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值