【问题标题】:How to upload file to amazon s3 using gin framework如何使用 gin 框架将文件上传到亚马逊 s3
【发布时间】:2018-01-12 16:23:58
【问题描述】:

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

系统找不到指定的文件。

我的做法如下

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

}

我正在像这样通过 POSTMAN 发送我的文件

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

【问题讨论】:

    标签: go amazon-s3 file-upload go-gin


    【解决方案1】:

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

    您需要致电FileHeader.Open。这将返回一个实现标准io.Reader 接口的multipart.File

    您应该更改AddFilesToS3 以获取文件名和io.Reader。然后可以为来自 gin 的文件以及常规文件调用它。

      fileHeader, err := c.FormFile("file")
      // check err
      f, err := fileHeader.Open()
      // check err
      err = AddFilesToS3(s, fileHeader.fileName, f)
    

    你的AddFilesToS3 现在是:

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

    您可能还需要传递fileHeader.Size()

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 2012-04-29
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2012-07-07
      相关资源
      最近更新 更多