如何使用gin框架将文件上传到amazon s3

Pra*_*gde 1 file-upload amazon-s3 go go-gin

我正在尝试使用 Go 的 gin 框架将文件上传到 Amazon S3。由于 aws-sdc 需要读取文件,我需要使用 os.open('filename') 打开文件。但是由于我从“formFile”获取文件,所以我没有要打开的文件的路径,os.Open()所以给出错误

该系统找不到指定的文件。

我的做法如下

package controllers

import (
    "bytes"
    "log"
    "net/http"
    "os"

    "github.com/gin-gonic/gin"

    "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"
)

const (
    S3_REGION = "MY REGION"
    S3_BUCKET = "<MY BUCKET>"
)

func UploadDocument(c *gin.Context) {
    var Buf bytes.Buffer
    file, _ := c.FormFile("file")

    creds := credentials.NewSharedCredentials("", "default")

    s, err := session.NewSession(&aws.Config{
        Region:      aws.String(S3_REGION),
        Credentials: creds,
    })
    if err != nil {
        log.Fatal(err)
    }

    err = AddFilesToS3(s, file.fileName)
    if err != nil {
        log.Fatal(err)
    }
}

func AddFilesToS3(s *session.Session, fileDir string) error {
    file, err := os.Open(fileDir)
    if err != nil {
        return err
    }
    defer file.Close()

    fileInfo, _ := file.Stat()
    var size int64 = fileInfo.Size()
    buffer := make([]byte, size)
    file.Read(buffer)

    _, err = s3.New(s).PutObject(&s3.PutObjectInput{
        Bucket:               aws.String(S3_BUCKET),
        Key:                  aws.String("myfolder" + "/" + fileDir),
        ACL:                  aws.String("private"),
        Body:                 bytes.NewReader(buffer),
        ContentLength:        aws.Int64(size),
        ContentType:          aws.String(http.DetectContentType(buffer)),
        ContentDisposition:   aws.String("attachment"),
        ServerSideEncryption: aws.String("AES256"),
    })
    return err

}
Run Code Online (Sandbox Code Playgroud)

我通过邮递员发送我的文件,如下所示

在此输入图像描述

由于我只发送文件名,我需要传递给“AddFilesToS3”函数,因此os.Open(fileDir)无法查看文件的实际路径。我哪里做错了或者有没有更好的方法可以做到这一点?

Mar*_*arc 6

您甚至没有从表单中读取文件。

您需要调用FileHeader.Open。这将返回一个实现标准接口的multipart.Fileio.Reader

您应该更改AddFilesToS3为采用文件名和io.Reader. 然后可以为 gin 中的文件以及常规文件调用此方法。

  fileHeader, err := c.FormFile("file")
  // check err
  f, err := fileHeader.Open()
  // check err
  err = AddFilesToS3(s, fileHeader.fileName, f)
Run Code Online (Sandbox Code Playgroud)

而你AddFilesToS3现在是:

func AddFilesToS3(s *session.Session, fileDir string, r io.Reader) error {
  // left as an exercise for the OP
Run Code Online (Sandbox Code Playgroud)

fileHeader.Size()您可能也需要通过。