【发布时间】:2014-03-19 09:33:52
【问题描述】:
我已通过 s3cmd 命令将 20000 个文件移动到 AWS S3。现在我想为所有图像(.jpg)添加缓存控制
这些文件位于 ( s3://bucket-name/images/ )。如何通过 s3cmd 为所有图像添加缓存控制,或者有没有其他方法可以添加标题?
谢谢
【问题讨论】:
标签: amazon-web-services amazon-s3 s3cmd
我已通过 s3cmd 命令将 20000 个文件移动到 AWS S3。现在我想为所有图像(.jpg)添加缓存控制
这些文件位于 ( s3://bucket-name/images/ )。如何通过 s3cmd 为所有图像添加缓存控制,或者有没有其他方法可以添加标题?
谢谢
【问题讨论】:
标签: amazon-web-services amazon-s3 s3cmd
请尝试当前的上游 master 分支 (https://github.com/s3tools/s3cmd),因为它现在有一个 modify 命令,使用如下:
./s3cmd --recursive modify --add-header="Cache-Control:max-age=86400" s3://yourbucket/
【讨论】:
Content-Type 错误已用#406 修复。
还有AWS自己的客户端:
aws s3 sync /path s3://yourbucket/ --cache-control max-age=604800
【讨论】:
find . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
--recursive 还需要吗? CLI 文档似乎没有将其列为参数。 docs.aws.amazon.com/cli/latest/reference/s3/sync.html
我的存储桶有 mp4、jpg 和其他文件。我要更新的文件存储在“子存储桶”中(例如:https://s3.amazonaws.com/my.bucket/sub-directory/my-video.mp4)。就我而言,我只想更新 mp4 文件的缓存控制:
aws s3 cp \
s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
--exclude '*.jpg' --exclude '*.png' \
--cache-control 'max-age=31104000' \
--recursive
要测试这会做什么,您可以使用--dryrun 标志:
aws s3 cp --dryrun \
s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
--exclude '*.jpg' --exclude '*.png' \
--cache-control 'max-age=31104000' \
--recursive
【讨论】:
--metadata-directive REPLACE --acl public-read。
--acl public-read
要调整 S3 中对象的缓存控制等元数据,而无需重新上传对象,也无需使用任何第三方工具,您可以使用 AWS CLI 执行以下操作。它将对象复制到自身,同时使用您选择的设置覆盖元数据:
aws s3api copy-object --copy-source <bucket-name>/<file> --bucket <bucket-name> --key <file> --metadata-directive REPLACE --cache-control "max-age=3600"
在 find 中处理此命令以对您提到的存储桶中已存在的现有文件集执行此操作:
find . -type f -exec aws s3api copy-object --copy-source <bucket-name>/{} --bucket <bucket-name> --key {} --metadata-directive REPLACE --cache-control "max-age=3600"
将<bucket-name>替换为您的存储桶名称
警告:这将覆盖文件上的所有现有元数据,例如 acl,只需在命令中添加其他标志以设置您需要的内容,例如,--acl public-read 以提供完全的公共访问权限。 (感谢@jackson)
【讨论】:
--acl public-read 运行命令。
如果您想避免使用第三方工具,并且这是一项一次性任务,您可以使用 AWS 控制台。
【讨论】:
PUT / ObjectName HTTP/1.1
Host: BucketName .s3.amazonaws.com
Date: date
x-amz-meta-Cache-Control : max-age= <value in seconds>
Authorization: signatureValue
每个元数据设置都包含一个键值对。缓存控制元数据键是“Cache-Control”,值是“max-age=<time for which you want your object to be accessed from cache in seconds>”
您可以通过两种方式向 Amazon S3 服务器发送带有适当标头的 HTTP PUT 请求,从而为 Amazon S3 对象设置缓存控制自定义标头:
使用 Amazon S3 REST API PUT 对象请求设置缓存控制元数据 - 如果您是程序员,您可以编写自己的软件程序以使用 Amazon S3 REST 或 SOAP API 来设置带有 PUT 对象请求的自定义标头。本网站仅提及 Amazon S3 REST API,有关如何使用 SOAP API 的详细信息,请参阅 AWS 文档网站。 使用 Bucket Explorer 用户界面设置缓存控制元数据 - 如果您想使用鼠标单击而不是编写软件程序来设置自定义 HTTP 标头(如缓存控制),您可以使用 Bucket Explorer 的用户界面。 使用此自定义 HTTP 标头,您可以指定请求/响应链必须遵循的缓存行为,并防止缓存干扰请求或响应。
更多信息请查看How to Set Cache Control Header for Amazon S3 Object?`
【讨论】:
(因为OP要求任何其他方式)
您也可以通过aws-cli 进行操作,例如(v:aws-cli/1.8.8 Python/2.7.2 Darwin/12.5.0):
aws s3api put-object \
--bucket mybucket \
--key my/key \
--cache-control max-age=1 \
--body myfile.txt
尽管请注意您将重写任何现有对象。
【讨论】:
老实说,这是最好的 atm 方式,不会遇到其他答案中提到的错误:
aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
【讨论】:
只需将 s3cmd 升级到 1.5.1 版本即可解决问题。
【讨论】:
另一种非常简单的方法是使用 S3 浏览器:http://s3browser.com/ 您只需 shift click 或 ctrl+a 即可选择您想要的所有图像;然后只需转到“Http Headers”选项卡并单击 - “Add new header” & 然后“Apply changes”。它自动保留了我所有的其他权限和标题。
如果你经常使用 S3;无论如何,它是一个很好的应用程序,尤其是如果你有大量的上传(在 ftp、Dropbox 或其他的世界里没有比这更好的了!)
【讨论】: