使用s3manager golang上传文件

时间:2016-03-25 17:04:58

标签: amazon-web-services go amazon-s3

我正在尝试从我的网站下载一些文件并将其上传到amazons3。

这是我的代码:

[Test]
public void PairsEqual()
{
    var p1a = new Pair<int>(10, 1);
    var p1b = new Pair<int>(10, 1);
    var p2 = new Pair<int>(10, 2);

    var equals = GetValueTypeEquals();

    Assert.That(!equals(p1a,  p2));
    Assert.That(equals(p1a, p1a));
    Assert.That(equals(p1a, p1b));
}

我一直得到一个nil指针取消引用的运行时错误,错误没有多大帮助,但由于某种原因,我认为它可能与ssl有关,但这里是整个错误:

import (
    "log"
    "net/http"

    "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/s3manager"
)

func main() {
    // Make a GET request to an image to be downloaded and uploaded to s3
    resp, err := http.Get("http://my-site.com/image.jpg")
    if err != nil {
        log.Fatal(err)
    }

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

    // Set up config
    config := &aws.Config{
        Region:      aws.String("US Standard"),
        Credentials: creds,
    }

    // Set up a new AWS session
    sess := session.New(config)

    // Set up a new s3manager client
    uploader := s3manager.NewUploader(sess)

    result, err := uploader.Upload(&s3manager.UploadInput{
        Body:   resp.Body,
        Bucket: aws.String("mimi-movies"),
        Key:    aws.String("mimi.jpg"),
    })
    if err != nil {
        log.Fatalln("Failed to upload", err)
    }

    log.Println("Successfully uploaded to", result.Location)
}

3 个答案:

答案 0 :(得分:4)

由于@ user3666882提到了aws-go-sdk中的错误,你应该查看你所在的地区。

在您的代码中,您已编写代码以获取AWS Credential。

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

您可以在终端中尝试:

  

aws configure

配置你的aws-sdk。

否则你可以使用Minio。但是你必须在代码中加入ACCESS_KEY_ID和SECRET_ACCESS_KEY,这对于生产使用来说非常糟糕。

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

此外,您可以使用外部API Viper来隐藏这些键。但我建议您使用官方AWS SDK for Go。

答案 1 :(得分:2)

aws-go-sdk上有一个错误,但解决方案是将区域更改为“us-east-1”

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

答案 2 :(得分:0)

您可以选择使用http://localhost:3000/tasks)客户端库,其开放源代码库和与AWS S3兼容。

以下是Minio-go

的简单示例
package main

import (
    "log"
    "os"

    "github.com/minio/minio-go"
)

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

    // Requests are always secure (HTTPS) by default. Set insecure=true to enable insecure (HTTP) access.
    // This boolean value is the last argument for New().

    // New returns an Amazon S3 compatible client object. API compatibility (v2 or v4) is automatically
    // determined based on the Endpoint value.
    s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", false)
    if err != nil {
        log.Fatalln(err)
    }

    object, err := os.Open("my-testfile")
    if err != nil {
        log.Fatalln(err)
    }
    defer object.Close()

    n, err := s3Client.PutObject("my-bucketname", "my-objectname", object, "application/octet-stream")
    if err != nil {
        log.Fatalln(err)
    }
    log.Println("Uploaded", "my-objectname", " of size: ", n, "Successfully.")
}
Status API Training Shop Blog About

希望它有所帮助。

免责声明:我为Put an object

工作