AWS S3或Amazon S3是从Amazon中存储并从网络上的任何地方检索文件的存储系统。这是亚马逊的高度可扩展,可靠,快速,廉价的数据存储系统。它提供了易于使用开发人员套件来存储和检索文件。
在本教程中,您将学习如何将批量文件上传到S3桶AWS Golang。我们将使用Go AWS SDK将文件上传到AWS S3。
GO的AWS SDK需要GO 1.15或更高版本。您可以通过运行以下命令来查看GO的当前版本。
go version
有关安装或升级GO版本的信息,请参见https://golang.org/doc/install
在使用AWS SDK进行GO V2之前,您必须拥有一个Amazon帐户。有关详细信息,请参见How do I create and activate a new AWS account?
下载AWS Golang SDK使用以下命令在您的代码库中使用
go get github.com/aws/aws-sdk-go/aws
我们将逐步介绍本教程,以使用Golang和示例代码上传批量文件。
。负载需要包装
我们将创建main.go文件和导入必要的软件包,我们需要将文件上传到AWS S3桶中。
package main
import (
"bytes"
"fmt"
"log"
"net/http"
"os"
"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"
)
接收器的自定义结构
我们将使用一个会话结构,以便我们可以使用与接收器相同的IT,然后将此接收器传递给我们的主要上传功能,
通过使用自定义结构,我们从代码中消除了重复。我们将仅使用单个会话来上传所有批量文件中的AWS Golang。
type Session struct {
S3Session *session.Session
}
设置主要配置和AWS会话
我们将使用AWS S3区域和秘密ID和秘密密钥设置配置,并创建单个AWS会话以将多个文件上传到AWS S3。然后,我们将调用方法上传(),然后将AWS会话实例和文件详细信息传递到上传文件到AWS S3服务器。
func main() {
paths := []string{"", ""}
credential := credentials.NewStaticCredentials(
os.Getenv("SECRET_ID"),
os.Getenv("SECRET_KEY"),
"",
)
awsConfig := aws.Config{
Region: aws.String(os.Getenv("REGION")),
Credentials: credential,
}
s, err := session.NewSession(&awsConfig)
if err != nil {
log.Println("failed to create S3 session:", err.Error())
return
}
se := Session{s}
err = se.upload(paths)
if err != nil {
log.Println(err.Error())
return
}
}
创建上传方法将批量文件上传到AWS S3
我们将创建Method Upload()将文件上传到AWS S3服务器。我们将一一打开文件,然后将文件存储到缓冲区中,然后使用S3中的PutObject()方法将文件放入AWS S3。上传文件时,我们还将在PutoBjectInput中指定选项。我们还将使用s3.putobjectInput结构的ServerSideConcryption选项对文件进行AES256加密。
func (s Session) upload(paths []string) error {
for _, path := range paths {
upFile, err := os.Open(path)
if err != nil {
log.Printf("failed %s, error: %v", path, err.Error())
continue
}
defer upFile.Close()
upFileInfo, err := upFile.Stat()
if err != nil {
log.Printf("failed to get stat %s, error: %v", path, err.Error())
continue
}
var fileSize int64 = upFileInfo.Size()
fileBuffer := make([]byte, fileSize)
upFile.Read(fileBuffer)
// uploading
_, err = s3.New(s.S3Session).PutObject(&s3.PutObjectInput{
Bucket: aws.String(os.Getenv("BUCKET_NAME")),
Key: aws.String(path),
ACL: aws.String("public-read"), // could be private if you want it to be access by only authorized users
Body: bytes.NewReader(fileBuffer),
ContentLength: aws.Int64(int64(fileSize)),
ContentType: aws.String(http.DetectContentType(fileBuffer)),
ContentDisposition: aws.String("attachment"),
ServerSideEncryption: aws.String("AES256"),
StorageClass: aws.String("INTELLIGENT_TIERING"),
})
if err != nil {
log.Printf("failed to upload %s, error: %v", path, err.Error())
continue
}
url := "https://%s.s3-%s.amazonaws.com/%s"
url = fmt.Sprintf(url, os.Getenv("BUCKET_NAME"), os.Getenv("REGION"), path)
fmt.Printf("Uploaded File Url %s\n", url)
}
return nil
}
您可以在我的personal blog
上查看更多这样的文章