"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"
tsgutils "github.com/typa01/go-utils"
type AmazonClient struct {
Region string
AccessKeyID string // id
SecretKey string // secret
BucketName string
UrlMain string
UrlFolder string // format "/operation/upload/jinhaiyun/"
FileType string
//options
Token string
ACL string
ContentType string
// operatte outcome
Session *session.Session
FilePath string // after upload, this file path will exist , which is the internal path, not include bucket
type ClientOpt struct {
//ACL: 权限枚举 https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl
ACL string
ContentType string
Token string
type Option func(ops *ClientOpt)
//For access controller
func WithAcl(acl string) Option {
return func(ops *ClientOpt) {
ops.ACL = acl
func WithContentType(contentType string) Option {
return func(ops *ClientOpt) {
ops.ContentType = contentType
func WithToken(token string) Option {
return func(ops *ClientOpt) {
ops.Token = token
func NewAmazonClient(region, accessKeyID, secretKey, bucketName, urlMain, urlFolder,fileType string, options ...Option) *AmazonClient {
optionsItem := new(ClientOpt)
for i := range options {
options[i](optionsItem)
client := new(AmazonClient)
client.ACL = optionsItem.ACL
client.ContentType = optionsItem.ContentType
client.Token = optionsItem.Token
client.Region = region
client.AccessKeyID = accessKeyID
client.SecretKey = secretKey
client.BucketName = bucketName
client.UrlMain = urlMain
client.UrlFolder = urlFolder
client.FileType = fileType
sess, err := session.NewSession(&aws.Config{
Region: aws.String(client.Region), //桶所在的区域
Credentials: credentials.NewStaticCredentials(client.AccessKeyID, client.SecretKey, client.Token), //sts的临时凭证
if err != nil {
panic(err)
client.Session = sess
return client
func (this *AmazonClient) Upload(buffer []byte) (url string, err error) {
filePath := this.UrlFolder + tsgutils.GUID() + this.FileType
this.FilePath=filePath
_, err = s3.New(this.Session).PutObject(&s3.PutObjectInput{
Bucket: aws.String(this.BucketName), //桶名
Key: aws.String(filePath), //文件的目录+文件名
Body: bytes.NewReader(buffer),
ACL: aws.String("public-read"),
//ContentType: aws.String("image/jpeg"),
if err != nil {
panic(err.Error())
url = this.UrlMain + filePath
return
func (this *AmazonClient) Download() (fileByte []byte, err error) {
out, err := s3.New(this.Session).GetObject(&s3.GetObjectInput{
Bucket: aws.String("moole-verify-img-bucket-dev"), //桶名
Key: aws.String(this.FilePath),
defer out.Body.Close()
if err != nil {
panic(err.Error())
scanner := bufio.NewScanner(out.Body)
for scanner.Scan() {
fileByte = scanner.Bytes()
return
package common_use
import (
"api_quant_manage_system/utils"
"github.com/spf13/viper"
"sync"
var xlsAWSClient *utils.AmazonClient
func InitxlsClient(v *viper.Viper)*utils.AmazonClient{
if xlsAWSClient ==nil{
once:=sync.Once{}
once.Do(func() {
if xlsAWSClient ==nil{
xlsAWSClient =utils.NewAmazonClient(
v.GetString("region"),
v.GetString("access_key_id"),
v.GetString("secret_key"),
v.GetString("bucket_name"),
v.GetString("url_main"),
v.GetString("url_folder"),
v.GetString("file_type"),
utils.WithToken(v.GetString("token")),
utils.WithAcl(v.GetString("acl")),
utils.WithAcl(v.GetString("content_type")),
return xlsAWSClient
func GetXlsAwsClient() *utils.AmazonClient {
return xlsAWSClient
在本文中,我们将探讨如何使用Golang编程语言和AWS SDK来操作AWS S3对象存储。AWS SDK提供了丰富的功能和API,使我们可以方便地进行云存储的管理和操作。除了上传文件之外,AWS SDK还提供了许多其他功能,如下载文件、列出存储桶中的对象、删除对象等等。接下来,我们设置要上传的本地文件的路径和S3存储桶的名称。最后,我们使用S3服务客户端的。在上面的示例中,我们首先创建了一个新的AWS会话,并指定了所在的区域。请注意,上述代码中的区域和存储桶名称是示例值,需要根据您的实际情况进行替换。
对象分片上传
对象的分片上传优势
使用分段上传可提供以下优势:建议您按以下方式使用分段上传:分段上分为三个步骤:开始上传、上传对象分段,以及在上传所有分段后完成分段上传。当您发送请求以开始分段上传时,Amazon S3 将返回具有上传 ID 的响应,此 ID 是分段上传的唯一标识符。无论您何时上传分段、列出分段、完成上传或停止上传,您都必须包括此上传 ID。如果您想要提供描述已上传的对象的任何元数据,必须在请求中提供它以开始分段上传。上传分段时,除了指定上传 ID,还必须指定
S3下载管理器确定文件是否可以拆分为更小的部分并并行下载。您可以自定义并行下载的数量和下载部分的大小。S3上传管理器确定文件是否可以拆分为更小的部分并并行上传。您可以自定义并行上传的数量和上传部分的大小。上传和下载管理器可以分解大型对象,以便可以将它们分成多个部分并行传输。这使得恢复中断的传输变得容易。下载的文件d_2.jpg如图。...
若不想升级go1.20,可以使用v1版本。官方推荐版本,需要go版本>=1.20。: 访问存储桶所需的AccessKey。: 访问存储桶所需的KeyID。: 存储桶所在区域,例。
首先,创建一个aws账户,可以在这里创建。
创建账户后,进入控制台,在storage分类中选择s3 服务。
在s3控制台,创建一个新的bucket,命名友好一些,因为bucket命名将会成为url的一部分。
bucket创建完以后,可以用来存储文件,此处即用来存储图片。
二、上传图片编码
开始之前,我们需要先从github上安装aws sdk,可以通过下边代码在终端上执行来完成。
$ go get github.com/aws/aws-sdk-go/...