很遗憾,我还没有找到一种通过Content-Type限制上传的方法,但我发现了一些小技巧可能会对您有所帮助。
首先,虽然这有点像用大锤子砸蚂蚁,但您可以通过应用存储桶策略来按文件名进行限制。这个AWS Knowledge Center的示例只允许上传几种图像类型。
{
"Version": "2012-10-17",
"Id": "Policy1464968545158",
"Statement": [
{
"Sid": "Stmt1464968483619",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:user/exampleuser"
},
"Action": "s3:PutObject",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
]
},
{
"Sid": "Stmt1464968483619",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"NotResource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
]
}
]
}
第二种方法,您可以在文件上传后
自动触发Lambda函数。使用此方法,您可以检查上传后想要的文件的任何内容。通常我更喜欢这种方法,但问题是如果文件无效,实际上没有任何即时反馈。
我的最后一个选项需要客户端做更多工作,这是我最近使用的方法。如果您正在上传非常大的文件,则S3要求您使用
分段上传。这不是像HTML表单一样的多部分;而是将文件分成块并上传每个块。如果您的文件足够小(我认为限制为5GB),则只需进行单个部分。上传所有部分后,必须向服务器发出另一个调用,以完成与S3的上传。这是您可以添加一些文件验证并在客户端仍在上传页面时响应客户端的地方。