[英]Sync objects to S3 with expires and cache-control headers using the CLI?
[英]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.