客户希望其网站能够上传最大 1GB 的文件。
当网站访问者发送 HTTP POST 请求时,服务器是否知道在请求开始时发送的文件大小 [content-length],或者是否必须获取整个文件才能获取真实的文件大小?
服务器将是 Linux 操作系统上启用 https 的 apache 或 nginx。处理语言将是 php 7。
文件将根据客户的要求直接上传到 amazon s3 存储桶。
答案1
正如@duskwuff 部分提到的,如果您允许用户将文件直接上传到 S3,那么您可以通过 S3 存储桶策略限制上传对象的大小。
S3 存储桶策略
可以找到有关 S3 存储桶策略的良好描述这里:
S3 存储桶策略指定存储桶策略所附加到的存储桶上的哪些主体允许或拒绝哪些操作(例如,允许用户 Alice 在存储桶中放置但不允许删除对象)。
这里有一系列不错的存储桶策略示例这里采取其中之一并对其进行修改,允许任何人将文件上传到 S3 存储桶但将文件大小限制为 1GB 的策略是:
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "AllowPublicUpload",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
['content-length-range', 1, 1073741824] //min and max
}
}
]
}
这使用了内容长度范围条件,其描述这里作为:
上传内容允许的最小和最大大小。
此条件支持内容长度范围条件匹配类型。
其他考虑因素
如果你想限制特定用户的上传,或者强制用户将上传内容放在主文件夹(即具有唯一名称的文件夹)中,那么你应该签出亚马逊 Cognito. 使用 Cognito,您可以使用包含代表 Cognito 用户 ID 等的变量的 IAM 策略。
最后要记住的是 s3:PutObject 可以覆盖文件,因此在决定允许用户上传到哪里时请记住这一点。
答案2
是的,服务器通过 Content-Length 请求标头知道请求正文的大小。
答案3
文件将根据客户的要求直接上传到 amazon s3 存储桶。
如果你正在这样做,你可以使用预签名 URL允许浏览器将对象直接上传到 S3。上传过程根本不需要经过您的 Web 服务器。
所使用的签名可以包括限制上传对象大小的策略。