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

时间:2018-01-12 07:44:53

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

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

  

系统找不到指定的文件。

我的方法如下

os.Open()

我正在通过POSTMAN发送我的文件

enter image description here

我需要传递给我的'AddFilesToS3'函数,因为我只发送文件名,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 } 无法查看文件的实际路径。 我在哪里做错了,还是有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

你甚至没有从表格中读取文件。

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

您应该更改AddFilesToS3以获取文件名和io.Reader。然后可以从杜松子酒和常规文件调用此文件。

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