我正在尝试使用Go的gin框架将文件上传到Amazon S3。由于aws-sdc需要读取文件,我需要使用os.open('filename')打开文件。但是因为我从“formFile”获取文件,所以我没有要打开文件的路径,所以{ {1}}正在提供错误
系统找不到指定的文件。
我的方法如下
os.Open()
我正在通过POSTMAN发送我的文件
我需要传递给我的'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
}
无法查看文件的实际路径。
我在哪里做错了,还是有更好的方法可以做到这一点?
答案 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()
。