gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:40 29 4
gpt4 key购买 nike

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

The system cannot find the file specified.

我的做法如下

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 发送我的文件

enter image description here

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

最佳答案

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

您需要调用FileHeader.Open .这将返回 multipart.File它实现了标准的 io.Reader 接口(interface)。

您应该更改 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()

关于go - 如何使用 gin 框架将文件上传到 amazon s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48221701/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com