Go 如何使用gin框架将文件上载到AmazonS3
我正在尝试使用Go的gin框架将一个文件上传到AmazonS3。由于aws sdc需要读取文件,我需要使用os.open('filename')打开文件。但由于我从“formFile”获取文件,我没有要打开的文件路径,因此Go 如何使用gin框架将文件上载到AmazonS3,go,amazon-s3,file-upload,go-gin,Go,Amazon S3,File Upload,Go Gin,我正在尝试使用Go的gin框架将一个文件上传到AmazonS3。由于aws sdc需要读取文件,我需要使用os.open('filename')打开文件。但由于我从“formFile”获取文件,我没有要打开的文件路径,因此os.open()给出了错误信息 系统找不到指定的文件 我的做法如下 package controllers import ( "bytes" "log" "net/http" "os" "github.com/gin-gonic/g
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
}
包控制器
进口(
“字节”
“日志”
“net/http”
“操作系统”
“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”
)
常数(
S3_REGION=“我的地区”
S3_BUCKET=“”
)
func上传文档(c*gin.Context){
var Buf字节。缓冲区
文件,\:=c.FormFile(“文件”)
凭据:=凭据。新闻共享凭据(“,“默认”)
s、 错误:=session.NewSession(&aws.Config){
区域:aws.String(S3_区域),
证书:信誉,
})
如果错误!=零{
log.Fatal(错误)
}
err=AddFilesToS3(s,file.fileName)
如果错误!=零{
log.Fatal(错误)
}
}
func AddFilesToS3(s*session.session,fileDir字符串)错误{
文件,错误:=os.Open(fileDir)
如果错误!=零{
返回错误
}
延迟文件。关闭()
fileInfo,u:=file.Stat()
var size int64=fileInfo.size()
缓冲区:=生成([]字节,大小)
file.Read(缓冲区)
_,err=s3.New.PutObject(&s3.PutObjectInput){
桶:aws.字符串(S3_桶),
关键字:aws.String(“myfolder”+“/”+fileDir),
ACL:aws.String(“private”),
正文:bytes.NewReader(缓冲区),
ContentLength:aws.Int64(大小),
ContentType:aws.String(http.DetectContentType(缓冲区)),
ContentDisposition:aws.String(“附件”),
ServerSideEncryption:aws.String(“AES256”),
})
返回错误
}
我是这样通过邮递员发送我的文件的
由于我只发送文件名,os.Open(fileDir)
无法查找文件的实际路径,因此需要传递给“AddFilesToS3”函数。
我哪里做错了,或者有没有更好的方法可以做到这一点?您甚至没有从表单中读取文件 你需要打电话。这将返回一个实现标准
io.Reader
接口的
您应该更改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()
。您甚至没有从表单中读取文件
你需要打电话。这将返回一个实现标准io.Reader
接口的
您应该更改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()