将 AWS S3 中所有文件的内容类型设置为 application/octet-stream

Posted

技术标签:

【中文标题】将 AWS S3 中所有文件的内容类型设置为 application/octet-stream【英文标题】:Set content-type to application/octet-stream for all files in AWS S3 【发布时间】:2019-01-09 00:04:14 【问题描述】:

我是 AWS S3 存储桶的新手,我正在尝试设置所有文件的权限以直接下载。我不希望我的视频或图像在浏览器中打开。我只想直接下载。

这是我的文件权限设置方式。


    "Version": "2008-10-17",
    "Statement": [
        
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": 
                "AWS": "*"
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mybucket/*"
        
    ]

有没有办法为所有文件设置Content-Type : application/octet-stream

谢谢!

【问题讨论】:

【参考方案1】:

响应头与权限无关。

如果您想要为您的文件指定特定的 Content-TypeContent-Disposition 标头,您可以在对象元数据中指定它们,如下所示:

在此处查看来自 AWS 的完整教程:https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html

当您上传文件时,例如使用AWS CLI,您可以同时指定Content-Type

aws s3api 放置对象 [--acl ] [--body ] --bucket [--cache-control ] [--content-disposition ] [--content-encoding ] [--content-language ] [--content-length ] [--content-md5 ] [--content-type ] ...

SDK 提供类似的功能。

【讨论】:

感谢您的回复。问题是,我们直接从 S3 存储桶上传视频,我们没有为此使用 CLI。并且无法更改所有单个文件上传的权限。所以我们可以在这里得到更好的东西,这将是非常有用的。 这个bucket到底是不是你的?如果是这样,无论您使用什么方法上传,您都可以更改响应标头。如果没有,您将无法覆盖其他人文件的标题。 是的,那是我的。如何更改响应标头?【参考方案2】:

据我所知,要么您无法控制传入的文件,要么对将内容推送到 s3 的代码或服务进行修改可能不是那么容易。不管怎样,我的选择是实现一个由 s3:object created 触发的 lambda,它只使用 AWS.S3:copyobject,源和目标相同,但元数据为 response-content-type application/octect-stream 和 response-content -处置附件。一旦 lambda 就位,应使用 AWS CLI 递归地复制现有文件以及现有文件上的新元数据。

更好地参考 AWS 文档以获取 lambda 和相应的开发工具包参考。查看 git 上的 AWS 存储库,您可能会发现一些相同的东西。

【讨论】:

以上是关于将 AWS S3 中所有文件的内容类型设置为 application/octet-stream的主要内容,如果未能解决你的问题,请参考以下文章

在 s3 aws 中为对象创建签名 url 时如何设置内容类型?

AWS 存储服务

如何使用 lambda 函数从 AWS s3 获取文本文件的内容?

默认情况下,如何将 AWS S3 存储桶中的所有对象设为公开?

将文件从 GCS 复制到 AWS S3 时如何设置 acl?

如何将 ARN 设置为 s3 策略资源 AWS