我在使用AWS S3 go sdk (https://github.com/awslabs/aws-sdk-go)在golang中保存文件时遇到了一些问题。
这就是我所拥有的:
import (
"fmt"
"bytes"
"github.com/awslabs/aws-sdk-go/aws"
"github.com/awslabs/aws-sdk-go/aws/awsutil"
"github.com/awslabs/aws-sdk-go/service/s3"
)
func main() {
cred := aws.DefaultChainCredentials
cred.Get() // i'm using environment variable credentials and yes, I checked if they were in here
svc := s3.New(&aws.Config{Region: "us-west-2", Credentials:cred, LogLevel: 1})
params := &s3.PutObjectInput{
Bucket: aws.String("my-bucket-123"),
Key: aws.String("test/123/"),
Body: bytes.NewReader([]byte("testing!")),
}
resp, err := svc.PutObject(params)
fmt.Printf("response %s", awsutil.StringValue(resp))
}我一直收到301 Moved Permanently响应。
编辑:手动创建存储桶。编辑#2:示例响应:
---[ RESPONSE ]--------------------------------------
HTTP/1.1 301 Moved Permanently
Transfer-Encoding: chunked
Content-Type: application/xml
Date: Tue, 05 May 2015 18:42:03 GMT
Server: AmazonS3POST sign也是http。
发布于 2015-05-07 05:58:20
根据Amazon的说法
亚马逊S3在所有地区都支持虚拟托管式和路径式访问。然而,路径样式的语法要求您在尝试访问存储桶时使用特定于区域的端点。例如,如果您有一个驻留在欧盟的名为mybucket的存储桶,您希望使用路径样式的语法,并且对象名为puppy.jpg,则正确的URI为http://s3-eu-west-1.amazonaws.com/mybucket/puppy.jpg。如果您尝试使用路径样式语法访问美国标准区域之外的存储桶,您将收到一个"PermanentRedirect“错误、一个HTTP响应代码301和一条消息,指示您的资源的正确URI是什么:
中创建的存储桶的http://s3-eu-west-1.amazonaws.com
我认为问题在于您正在尝试访问错误区域中的存储桶。您的请求将在此处发送:
https://my-bucket-123.s3-us-west-2.amazonaws.com/test/123因此,请确保my-bucket-123实际上在us-west-2中。(我用我自己的桶试过了,它工作得很好)
我还通过封装调用来验证它是否使用了HTTPS:(他们的日志消息是错误的)
type LogReadCloser struct {
io.ReadCloser
}
func (lr *LogReadCloser) Read(p []byte) (int, error) {
n, err := lr.ReadCloser.Read(p)
log.Println(string(p))
return n, err
}
type LogRoundTripper struct {
http.RoundTripper
}
func (lrt *LogRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
log.Println("REQUEST", req)
res, err := lrt.RoundTripper.RoundTrip(req)
log.Println("RESPONSE", res, err)
res.Body = &LogReadCloser{res.Body}
return res, err
}然后:
svc := s3.New(&aws.Config{
Region: "us-west-2",
Credentials: cred,
LogLevel: 0,
HTTPClient: &http.Client{Transport: &LogRoundTripper{http.DefaultTransport}},
})发布于 2020-05-27 15:05:06
我认为你最好使用S3上传器。这是我的代码中的一个例子,它是一个web应用程序,我使用gin框架,在我的例子中,我从web表单中获取一个文件,将其上传到s3,并检索URL以在其他HTML中显示页面:
// Create an S3 Uploader
uploader := s3manager.NewUploader(sess)
// Upload
result, err := uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(fileHeader.Filename),
Body: f,
})
if err != nil {
c.HTML(http.StatusBadRequest, "create-project.html", gin.H{
"ErrorTitle": "S3 Upload Failed",
"ErrorMessage": err.Error()})
} else {
// Success, print URL to Console.
///"result.Location is the URL of an Image"
fmt.Println("Successfully uploaded to", result.Location)
}你可以在这里找到一个完整的例子,一步一步地解释:https://www.matscloud.com/docs/cloud-sdk/go-and-s3/
https://stackoverflow.com/questions/30059723
复制相似问题