Golang教程:使用Golang将批量文件上传到AWS S3
#aws #教程 #go #s3

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

上查看更多这样的文章

Full Code