"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/...