gpt4 book ai didi

go - 文件上传到 s3 但不可见

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

我正在尝试使用 GoLang 将图像上传到 s3 存储桶。我已经提到了程序的函数体。它将一个图像文件作为多部分表单数据和一个我应该将图像保存在 s3 中的文件名。

func uploadImage(res http.ResponseWriter, req *http.Request) {
file, handler, err := req.FormFile("uploaded_file") // uploaded_file is the key(input field name) of the form-data
if err != nil {
fmt.Println(err)
return
}

type Resp struct {
Status string `json:"status"`
Filename string `json:"filename"`
}
filename := req.Form.Get("filename")

rnd := render.New()
var Response Resp
Response.Status = "failed"
if filename != "" {
// define credentials
awsAccessKey := "KEY"
awsSecret := "SECRET"
token := ""
// set credentials
creds := credentials.NewStaticCredentials(awsAccessKey, awsSecret, token)
credentials, err := creds.Get()
if err != nil {
fmt.Printf("bad credentials: %s", err)
}
fmt.Println(credentials)
//setup config and s3 settings
cfg := aws.NewConfig().WithRegion("ap-southeast-1").WithCredentials(creds)

//create s3 credentail
svc := s3.New(session.New(), cfg)
type Sizer interface {
Size() int64
}

size := file.(Sizer).Size()
// create a buffer of size = images size
buffer := make([]byte, size)
file.Read(buffer)
fileBytes := bytes.NewReader(buffer)
fileType := http.DetectContentType(buffer)

path := "mybucketname/" + filename
params := &s3.PutObjectInput{
Bucket: aws.String("mybucketname"),
Key: aws.String(path),
Body: fileBytes,
ContentLength: aws.Int64(size),
ContentType: aws.String(fileType),
ACL: aws.String("public-read"),
}
resp, err := svc.PutObject(params)
if err != nil {
fmt.Printf("bad response: %s", err)
}
fmt.Printf("response %s", awsutil.StringValue(resp))

Response.Status = "success"
Response.Filename = awsutil.StringValue(resp)

}

defer file.Close()
res.Header().Set("Content-Type", "application/json")
rnd.JSON(res, http.StatusOK, Response)
}

此函数返回成功上传图片和文件名作为http响应的成功状态。

在控制台中我可以看到一些响应:

response {
ETag: "\"bd9be6ada974e66a154552edc78b4a81\""
}

我不知道 ETag 是什么意思,但我知道图像已上传并且我从 s3 得到了一些积极的回应。但是我找不到我在 s3 中上传的图片。

我需要一些帮助来解决这个问题。提前致谢。

最佳答案

您可以像这样检索上传的 s3 对象:

svc := s3.New(session.New(), cfg)

path := "mybucketname/" + filename
input := &s3.GetObjectInput{
Bucket: aws.String("mybucketname"),
Key: aws.String(path),
}

result, err := svc.GetObject(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchKey:
fmt.Println(s3.ErrCodeNoSuchKey, aerr.Error())
default:
fmt.Println(aerr.Error())
}
} else {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
}
return
}

fmt.Println(result)

不要脸的外挂:您还可以使用我从以下链接创建的命令行工具来查看对象。

https://github.com/bharath-srinivas/nephele

你只需要做:

$ nephele s3 list <bucket-name> --prefix <prefix of the key/filename>

您可以在这里引用aws-sdk-go的官方文档:https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.GetObject

关于go - 文件上传到 s3 但不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49249633/

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