使用Go的AWS Presigned URL“未实现”

Trying to use presigned URLs to upload a file to S3 using Go.

I took AWS's own example and modified it to add a file (rather than just text).


package main

import (
    "crypto/md5"
    "encoding/base64"
    "fmt"
    "net/http"
    "os"
    "strings"
    "time"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

// Downloads an item from an S3 Bucket in the region configured in the shared config
// or AWS_REGION environment variable.
//
// Usage:
//    go run s3_download.go
func main() {
    h := md5.New()
    content := strings.NewReader("")
    content.WriteTo(h)

    // Initialize a session in us-west-2 that the SDK will use to load
    // credentials from the shared credentials file ~/.aws/credentials.
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-west-2")},
    )

    // Create S3 service client
    svc := s3.New(sess)

    bucket_name := "just.some.bucket"
    object_key := "7920629709534756622.png"
    file, err := os.Open(object_key)
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()

    resp, _ := svc.PutObjectRequest(&s3.PutObjectInput{
        Bucket: aws.String(bucket_name),
        Key:    aws.String(object_key),
    })

    md5s := base64.StdEncoding.EncodeToString(h.Sum(nil))
    resp.HTTPRequest.Header.Set("Content-MD5", md5s)

    url, err := resp.Presign(15 * time.Minute)
    if err != nil {
        fmt.Println("error presigning request", err)
        return
    }

    req, err := http.NewRequest("PUT", url, file)
    req.Header.Set("Content-MD5", md5s)
    if err != nil {
        fmt.Println("error creating request", url)
        return
    }

    defClient, err := http.DefaultClient.Do(req)
    fmt.Println(defClient, err)
}

I'm receiving a Not Implemented 501 error and can't figure out why.

The bucket is new with default settings. Do I need to add CORS allowances or something?