繁体   English   中英

给定S3路径以及有效的密钥和机密,如何更新对象缓存控制标头?

[英]Given an S3 path and a valid key and secret, how do I update an objects cache-control headers?

将文件头上传到S3后,我需要对其进行更新。 我没有对上传过程的控制权(我正在使用FilePicker.io API,该API到目前为止还没有提供指定缓存控制标头的方法),它们只是神奇地出现在存储桶中。 我拥有对象的完整s3路径以及存储桶的密钥和秘密。

使用Go,向这些对象添加新标题的最简单方法是什么? 似乎您需要执行PUT复制请求,但这需要请求签名,并且它会覆盖所有现有的标头。 我要做的就是添加一个缓存控制标头,必须有一种更简单的方法吧?

下面的小程序应该简单地将缓存控制标头添加到给定的存储桶/键组合中。 重要的是s3.CopyOptions结构。 MetadataDirective也可以是COPY有关详细信息,请参见http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html 源也必须是存储桶/密钥,因为源当然可以在另一个存储桶中。

package main

import (
    "fmt"
    "os"

    "github.com/goamz/goamz/aws"
    "github.com/goamz/goamz/s3"
    //// should work as well
    //"github.com/crowdmob/goamz/aws"
    //"github.com/crowdmob/goamz/s3"
)

func main() {
    // use as
    //  $ go run s3meta.go bucket key
    // will add a 1 hour Cache-Control header to
    // key in bucket
    auth := aws.Auth{
        AccessKey: os.Getenv("AWS_ACCESS_KEY_ID"),
        SecretKey: os.Getenv("AWS_SECRET_KEY_ID"),
    }

    bucketName, keyName := os.Args[1], os.Args[2]

    bucket := s3.New(auth, aws.USEast).Bucket(bucketName)
    opts := s3.CopyOptions{}
    opts.CacheControl = "maxage=3600"
    opts.MetadataDirective = "REPLACE"

    _, err := bucket.PutCopy(keyName, s3.PublicRead, opts, bucketName+"/"+keyName)
    if err != nil {
        panic(err)
    }

}

试运行(此后已删除存储桶):

╭─brs at stengaard in ~/ using
╰─○ curl  -I https://s3.amazonaws.com/cf-templates-1r14by1vl75o0-us-east-1/success.png
HTTP/1.1 200 OK
x-amz-id-2: 49oTuRARMHlx32nqv34CMOjdTMBUCZIVzP8YKBS2Wz5h1w5KBG62u8nFru1UkIbJ
x-amz-request-id: C92E9952BFF31D77
Date: Mon, 30 Jun 2014 08:57:15 GMT
Last-Modified: Mon, 30 Jun 2014 08:50:45 GMT
ETag: "41b9951893f1bbff89e2b9c8a5b7ea18"
Accept-Ranges: bytes
Content-Type: image/png
Content-Length: 61585
Server: AmazonS3

╭─brs at stengaard in ~/ using
╰─○ go run s3meta.go cf-templates-1r14by1vl75o0-us-east-1 success.png
╭─brs at stengaard in ~/ using
╰─○ curl  -I https://s3.amazonaws.com/cf-templates-1r14by1vl75o0-us-east-1/success.png
HTTP/1.1 200 OK
x-amz-id-2: oiDeXjO1V4kquWo8UlNWBi/HAHoqfvlOSHVeXFZXv2yA4o0+Njcdshhu15PIiw7J
x-amz-request-id: 0BB1A397DE7EBE75
Date: Mon, 30 Jun 2014 09:00:17 GMT
Cache-Control: maxage=3600
Last-Modified: Mon, 30 Jun 2014 09:00:12 GMT
ETag: "41b9951893f1bbff89e2b9c8a5b7ea18"
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 61585
Server: AmazonS3

请注意,由于我们具有opts.MetadataDirective = "REPLACE" ,因此Content-Type也发生了变化。 如果这个小事情值得,带外更新标头的麻烦实际上是特定于域的:在客户端中缓存上载的文件有多重要? 向S3发出HEAD请求是否昂贵?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM