我的 Amazon S3 存储桶中的对象都是内容类型
application/octet-stream
。其中一些对象是 PDF,有时是图像,如 JPG
、GIF
、PNG
。如何将这些对象的内容类型更改为 images/jpeg
、application/pdf
等?
可以通过亚马逊控制台批量完成吗?
我可以使用命令行吗?
或者也许通过 PHP?
这是您为所有类型为
*.png的文件设置
Content-Type
的方法
aws s3 cp \
s3://BUCKET-NAME/ \
s3://BUCKET-NAME/ \
--exclude '*' \
--include '*.png' \
--no-guess-mime-type \
--content-type="image/png" \
--metadata-directive="REPLACE" \
--recursive
您可以使用AWS sdk(php或其他)我将使用CLI展示它是如何工作的。要更改 S3 给定对象上的内容类型,您需要复制该对象并使用
REPLACE
标签更新元数据信息,以便它复制到自身,您可以使用 http://docs.aws.amazon.com/ 来实现cli/latest/reference/s3api/copy-object.html
aws s3api copy-object --bucket <bucket_name> \
--content-type "images/jpeg" \
--copy-source <bucket_name>/path/to/images.jpeg \
--key path/to/images.jpeg \
--metadata-directive "REPLACE"
aws s3 ls \
s3://<YOUR_BUCKET> --recursive |
awk '{print substr($0, index($0, $4))}' |
grep <FILE_EXTENSTION> |
while read -r line; do \
aws s3api copy-object \
--bucket <YOUR_BUCKET> \
--acl "<ACL_POLICY_IF_NEEDED>" \
--content-type "<REQUIRED_CONTENT_TYPE>" \
--copy-source "<YOUR_BUCKET>/$line" \
--key "$line" --metadata-directive "REPLACE"; \
done
这样就可以了。分解命令:
aws s3 ls s3://<YOUR_BUCKET> --recursive
=> 这会列出您存储桶中的所有文件awk '{print substr($0, index($0, $4))}'
=> 这将删除日期等额外信息,只为您提供所有键列表grep <FILE_EXTENSTION>
=> 这将过滤您想要更新内容类型的扩展名(例如 pdf/jpg)while read -r line; do aws s3api copy-object --bucket <YOUR_BUCKET> --acl "<ACL_POLICY_IF_NEEDED>" --content-type "<REQUIRED_CONTENT_TYPE>" --copy-source "<YOUR_BUCKET>/$line" --key "$line" --metadata-directive "REPLACE"; done
=> 这会将存储桶中所有已过滤的文件替换为您指定的内容类型我不想使用 s3api,因为它需要
Copy
IAM 权限。
我也不喜欢这种方法,因为它需要
List
IAM 权限:
aws s3 cp \
s3://BUCKET-NAME/ \
s3://BUCKET-NAME/
此同步方法效果完美,请注意我的不带扩展名的
all-mixtapes
文件位于根目录中并设置为 binary/octet-stream
,因此我需要显式地将其 Content-Type 更改为 text/html
:
aws s3 sync "$BUILD_DIR" "s3://$BUCKET_NAME" --exclude "*" --include "all-mixtapes" --content-type "text/html" $PROFILE_ARG --acl public-read --metadata-directive="REPLACE" --region $REGION --cache-control $CACHE_MAX_AGE
不要省略必需的
--metadata-directive="REPLACE"
参数。