猿问

如何在 golang 中编码 POST 策略 - 基于浏览器的上传到亚马逊 S3?

我正在尝试将图像文件上传到亚马逊 s3。设置如下:


Web 服务器:golang

前端:用于测试的简单html表单


参考本文档:http : //docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html


我参考了上面文档中提供的示例并尝试了这个:http :

//play.golang.org/p/3zn5fSDasK


  package main


  import "fmt"

  import "encoding/base64"


  func main() {

         bytePolicy := []byte(`{ 

                    "expiration": "2013-08-06T12:00:00.000Z",

                    "conditions": [

                             {"bucket": "examplebucket"},

                             ["starts-with", "$key", "user/user1/"],

                             {"acl": "public-read"},

                             {"success_action_redirect": "http://acl6.s3.amazonaws.com/successful_upload.html"},

                             ["starts-with", "$Content-Type", "image/"],

                             {"x-amz-meta-uuid": "14365123651274"},

                             ["starts-with", "$x-amz-meta-tag", ""],

                             {"x-amz-credential":"AKIAIOSFODNN7EXAMPLE/20130806/us-east-1/s3/aws4_request"},

                             {"x-amz-algorithm": "AWS4-HMAC-SHA256"},

                             {"x-amz-date": "20130806T000000Z" }

                      ]

                  }`)

        fmt.Println(base64.StdEncoding.EncodeToString(bytePolicy))

 }

为什么我的 base64 编码策略与亚马逊的策略不匹配?


慕尼黑5688855
浏览 194回答 1
1回答

HUH函数

仅仅是因为产生这些 base64 字符串的 2 个 JSON 源文本具有不同的缩进和不同的内容,如下所示(它们不等于逐个字符)。解码这两个 base64 字符串,您将看到差异。你可以用一个程序(不一定是 Go)来做到这一点,或者简单地使用像这样的在线服务。您不应该担心缩进,这在 JSON 中无关紧要。但是,当您使用 Base64 对文本进行编码时,会对源的所有字符进行编码,包括用于缩进的空格和制表符,因此不同的缩进将导致不同的 Base64 编码形式。但是对比2个解码的JSON,还有其他的不同:第一:"expiration": "2013-08-06T12:00:00.000Z""success_action_redirect": "http://acl6.s3.amazonaws.com/successful_upload.html"第二个:"expiration": "2013-08-07T12:00:00.000Z""success_action_redirect": "http://examplebucket.s3.amazonaws.com/successful_upload.html"完整解码的 JSON 文本:第一个:{                         "expiration": "2013-08-06T12:00:00.000Z",                        "conditions": [                                 {"bucket": "examplebucket"},                                ["starts-with", "$key", "user/user1/"],                                 {"acl": "public-read"},                                 {"success_action_redirect": "http://acl6.s3.amazonaws.com/successful_upload.html"},                                ["starts-with", "$Content-Type", "image/"],                                {"x-amz-meta-uuid": "14365123651274"},                                ["starts-with", "$x-amz-meta-tag", ""],                                {"x-amz-credential":"AKIAIOSFODNN7EXAMPLE/20130806/us-east-1/s3/aws4_request"},                                {"x-amz-algorithm": "AWS4-HMAC-SHA256"},                               {"x-amz-date": "20130806T000000Z" }                          ]                    }第二个:{ "expiration": "2013-08-07T12:00:00.000Z",  "conditions": [    {"bucket": "examplebucket"},    ["starts-with", "$key", "user/user1/"],    {"acl": "public-read"},    {"success_action_redirect": "http://examplebucket.s3.amazonaws.com/successful_upload.html"},    ["starts-with", "$Content-Type", "image/"],    {"x-amz-meta-uuid": "14365123651274"},    ["starts-with", "$x-amz-meta-tag", ""],    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20130806/us-east-1/s3/aws4_request"},    {"x-amz-algorithm": "AWS4-HMAC-SHA256"},    {"x-amz-date": "20130806T000000Z" }  ]}
随时随地看视频慕课网APP
我要回答