Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何使用gin框架将文件上载到AmazonS3_Go_Amazon S3_File Upload_Go Gin - Fatal编程技术网

Go 如何使用gin框架将文件上载到AmazonS3

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

我正在尝试使用Go的gin框架将一个文件上传到AmazonS3。由于aws sdc需要读取文件,我需要使用os.open('filename')打开文件。但由于我从“formFile”获取文件,我没有要打开的文件路径,因此
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()