使用s3manager上传文件

huangapple go评论119阅读模式
英文:

Uploading a file with s3manager

问题

我正在尝试从我的网站下载一些文件并将它们上传到Amazon S3。

以下是我的代码:

  1. import (
  2. "log"
  3. "net/http"
  4. "github.com/aws/aws-sdk-go/aws"
  5. "github.com/aws/aws-sdk-go/aws/credentials"
  6. "github.com/aws/aws-sdk-go/aws/session"
  7. "github.com/aws/aws-sdk-go/service/s3/s3manager"
  8. )
  9. func main() {
  10. // 发送GET请求以下载并上传到s3的图像
  11. resp, err := http.Get("http://my-site.com/image.jpg")
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. // 获取AWS凭证
  16. creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")
  17. // 设置配置
  18. config := &aws.Config{
  19. Region: aws.String("US Standard"),
  20. Credentials: creds,
  21. }
  22. // 创建新的AWS会话
  23. sess := session.New(config)
  24. // 创建新的s3manager客户端
  25. uploader := s3manager.NewUploader(sess)
  26. result, err := uploader.Upload(&s3manager.UploadInput{
  27. Body: resp.Body,
  28. Bucket: aws.String("mimi-movies"),
  29. Key: aws.String("mimi.jpg"),
  30. })
  31. if err != nil {
  32. log.Fatalln("上传失败", err)
  33. }
  34. log.Println("成功上传至", result.Location)
  35. }

我一直收到一个运行时错误,指向空指针解引用。错误信息并没有提供太多帮助,但我认为可能与SSL有关。以下是完整的错误信息:

  1. panic: runtime error: invalid memory address or nil pointer dereference
  2. [signal 0xb code=0x1 addr=0x0 pc=0x236ffe]
  3. goroutine 1 [running]:
  4. panic(0x4743c0, 0xc82000a0e0)
  5. /usr/local/Cellar/go/1.6/libexec/src/runtime/panic.go:464 +0x3e6
  6. github.com/aws/aws-sdk-go/service/s3.validateSSERequiresSSL(0xc820066380)
  7. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/sse.go:15 +0x17e
  8. github.com/aws/aws-sdk-go/aws/request.(*HandlerList).Run(0xc820066478, 0xc820066380)
  9. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/handlers.go:136 +0xc3
  10. github.com/aws/aws-sdk-go/aws/request.(*Request).Build(0xc820066380, 0x0, 0x0)
  11. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:189 +0x69
  12. github.com/aws/aws-sdk-go/aws/request.(*Request).Sign(0xc820066380, 0x0, 0x0)
  13. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:210 +0x31
  14. github.com/aws/aws-sdk-go/aws/request.(*Request).Send(0xc820066380, 0x0, 0x0)
  15. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:261 +0x6f4
  16. github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).singlePart(0xc8201520f0, 0x8bb980, 0xc82014a030, 0xc82000a140, 0x0, 0x0)
  17. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:449 +0x1fc
  18. github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).upload(0xc8201520f0, 0xc8201520f0, 0x0, 0x0)
  19. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:355 +0x563
  20. github.com/aws/aws-sdk-go/service/s3/s3manager.Uploader.Upload(0x500000, 0x5, 0x0, 0x2710, 0xe00240, 0xc820156018, 0xc82016e000, 0x0, 0x0, 0x0, ...)
  21. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:329 +0x15a
  22. main.main()
  23. /Users/name/work/src/gitlab.com/user/project/test/main.go:39 +0x59f
  24. exit status 2

希望这可以帮助你解决问题。

英文:

I'm trying to download a few files from my website and upload them to amazons3.

Here is my code:

  1. import (
  2. "log"
  3. "net/http"
  4. "github.com/aws/aws-sdk-go/aws"
  5. "github.com/aws/aws-sdk-go/aws/credentials"
  6. "github.com/aws/aws-sdk-go/aws/session"
  7. "github.com/aws/aws-sdk-go/service/s3/s3manager"
  8. )
  9. func main() {
  10. // Make a GET request to an image to be downloaded and uploaded to s3
  11. resp, err := http.Get("http://my-site.com/image.jpg")
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. // Get the AWS credentials
  16. creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")
  17. // Set up config
  18. config := &aws.Config{
  19. Region: aws.String("US Standard"),
  20. Credentials: creds,
  21. }
  22. // Set up a new AWS session
  23. sess := session.New(config)
  24. // Set up a new s3manager client
  25. uploader := s3manager.NewUploader(sess)
  26. result, err := uploader.Upload(&s3manager.UploadInput{
  27. Body: resp.Body,
  28. Bucket: aws.String("mimi-movies"),
  29. Key: aws.String("mimi.jpg"),
  30. })
  31. if err != nil {
  32. log.Fatalln("Failed to upload", err)
  33. }
  34. log.Println("Successfully uploaded to", result.Location)
  35. }

I keep getting a run time error of a nil pointer dereference the error doesn't help much but for some reason I think it might have to do with ssl but here is the entire error:

  1. panic: runtime error: invalid memory address or nil pointer dereference
  2. [signal 0xb code=0x1 addr=0x0 pc=0x236ffe]
  3. goroutine 1 [running]:
  4. panic(0x4743c0, 0xc82000a0e0)
  5. /usr/local/Cellar/go/1.6/libexec/src/runtime/panic.go:464 +0x3e6
  6. github.com/aws/aws-sdk-go/service/s3.validateSSERequiresSSL(0xc820066380)
  7. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/sse.go:15 +0x17e
  8. github.com/aws/aws-sdk-go/aws/request.(*HandlerList).Run(0xc820066478, 0xc820066380)
  9. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/handlers.go:136 +0xc3
  10. github.com/aws/aws-sdk-go/aws/request.(*Request).Build(0xc820066380, 0x0, 0x0)
  11. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:189 +0x69
  12. github.com/aws/aws-sdk-go/aws/request.(*Request).Sign(0xc820066380, 0x0, 0x0)
  13. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:210 +0x31
  14. github.com/aws/aws-sdk-go/aws/request.(*Request).Send(0xc820066380, 0x0, 0x0)
  15. /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:261 +0x6f4
  16. github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).singlePart(0xc8201520f0, 0x8bb980, 0xc82014a030, 0xc82000a140, 0x0, 0x0)
  17. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:449 +0x1fc
  18. github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).upload(0xc8201520f0, 0xc8201520f0, 0x0, 0x0)
  19. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:355 +0x563
  20. github.com/aws/aws-sdk-go/service/s3/s3manager.Uploader.Upload(0x500000, 0x5, 0x0, 0x2710, 0xe00240, 0xc820156018, 0xc82016e000, 0x0, 0x0, 0x0, ...)
  21. /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:329 +0x15a
  22. main.main()
  23. /Users/name/work/src/gitlab.com/user/project/test/main.go:39 +0x59f
  24. exit status 2

答案1

得分: 4

如@user3666882所提到的,aws-go-sdk中存在一个错误,你应该检查一下你的区域。

在你的代码中,你已经编写了获取AWS凭证的代码。

  1. // 获取AWS凭证
  2. creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")

你可以尝试在终端中执行以下命令:

aws configure

并配置你的aws-sdk。

否则,你可以使用Minio。但是你必须将你的ACCESS_KEY_ID和SECRET_ACCESS_KEY放入你的代码中,这对于生产环境来说是非常不好的。

  1. s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", false)

另外,你可以使用外部API Viper 来隐藏这些密钥。但我建议你使用官方的AWS SDK for Go。

英文:

As @user3666882 mentioned there's bug in aws-go-sdk and you should probably check your region.

In your code, you have written code to get AWS Credential.

  1. // Get the AWS credentials
  2. creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")

You might try this in your terminal :

> aws configure

And configure your aws-sdk.

Else you can use Minio. But your have to put your ACCESS_KEY_ID and SECRET_ACCESS_KEY in your code, which is very bad for production use.

  1. s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", false)

Also, you can use external API Viper to hide these keys. But I recommend you to use official AWS SDK for Go.

答案2

得分: 2

有一个 aws-go-sdk 的 bug,但解决方法是将区域更改为 "us-east-1"

// 设置配置
config := &aws.Config{
Region: aws.String("us-east-1"),
Credentials: creds,
}

英文:

There is a bug on the aws-go-sdk but the solution is to change the region to "us-east-1"

  1. // Set up config
  2. config := &aws.Config{
  3. Region: aws.String("us-east-1"),
  4. Credentials: creds,
  5. }

答案3

得分: 0

你可以选择使用Minio-go客户端库,它是开源的,并且与AWS S3兼容。

这里是一个简单的示例来上传对象

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "github.com/minio/minio-go"
  6. )
  7. func main() {
  8. // 注意:YOUR-ACCESSKEYID、YOUR-SECRETACCESSKEY、my-testfile、my-bucketname和my-objectname是虚拟值,请将它们替换为实际值。
  9. // 默认情况下,请求始终是安全的(HTTPS)。设置insecure=true以启用不安全的(HTTP)访问。
  10. // 这个布尔值是New()的最后一个参数。
  11. // New返回一个兼容Amazon S3的客户端对象。API兼容性(v2或v4)会根据Endpoint值自动确定。
  12. s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", false)
  13. if err != nil {
  14. log.Fatalln(err)
  15. }
  16. object, err := os.Open("my-testfile")
  17. if err != nil {
  18. log.Fatalln(err)
  19. }
  20. defer object.Close()
  21. n, err := s3Client.PutObject("my-bucketname", "my-objectname", object, "application/octet-stream")
  22. if err != nil {
  23. log.Fatalln(err)
  24. }
  25. log.Println("已上传", "my-objectname", "大小为:", n, "成功.")
  26. }

希望对你有帮助。

免责声明:我为Minio工作。

英文:

You could have alternatively used Minio-go client libraries, its Open Source & compatible with AWS S3.

Here is a simple example to Put an object

<pre>
package main

import (
"log"
"os"

  1. &quot;github.com/minio/minio-go&quot;

)

func main() {
// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname and
// my-objectname are dummy values, please replace them with original values.

  1. // Requests are always secure (HTTPS) by default. Set insecure=true to enable insecure (HTTP) access.
  2. // This boolean value is the last argument for New().
  3. // New returns an Amazon S3 compatible client object. API compatibility (v2 or v4) is automatically
  4. // determined based on the Endpoint value.
  5. s3Client, err := minio.New(&quot;s3.amazonaws.com&quot;, &quot;YOUR-ACCESSKEYID&quot;, &quot;YOUR-SECRETACCESSKEY&quot;, false)
  6. if err != nil {
  7. log.Fatalln(err)
  8. }
  9. object, err := os.Open(&quot;my-testfile&quot;)
  10. if err != nil {
  11. log.Fatalln(err)
  12. }
  13. defer object.Close()
  14. n, err := s3Client.PutObject(&quot;my-bucketname&quot;, &quot;my-objectname&quot;, object, &quot;application/octet-stream&quot;)
  15. if err != nil {
  16. log.Fatalln(err)
  17. }
  18. log.Println(&quot;Uploaded&quot;, &quot;my-objectname&quot;, &quot; of size: &quot;, n, &quot;Successfully.&quot;)

}
Status API Training Shop Blog About

</pre>

Hope it helps.

Disclaimer: I work for Minio

huangapple
  • 本文由 发表于 2016年3月26日 01:04:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/36224477.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定