我正在构建一个允许用户上传文件的网络应用。 我想限制单个文件大小说< 100 MB,并将用户的使用情况跟踪到一定数量(非常像Dropbox)。如果达到限制,他们就无法上传,或者他们可以支付更高的费用以上限。
让用户直接上传到AWS S3(或者如果存在任何差异,可能是谷歌云存储......)是一个好习惯吗?我看到有人说直接上传大大降低了服务器负载,但却无法跟踪用户的使用情况?
如果我让用户直接上传到S3,有没有办法或解决用户使用情况? 如果没有,我如何流式传输或重定向文件以从用户上传到Web服务器,然后上传到S3,并跟踪每个用户的使用情况?
答案 0 :(得分:2)
您可以允许直接上传并跟踪每个用户的上传,也可以限制文件大小。
这里有一篇很棒的文章解释了直接上传如何在一个工作示例上运行:Browser Uploads to S3 using HTML POST Forms
所以要解决你的问题:
您可以限制文件大小。您只需在政策中指定它:
{
"expiration": "2009-01-01T00:00:00Z",
"conditions": [
{"bucket": "s3-bucket"},
["starts-with", "$key", "user-id/"], --> Can be unique to each user
{"acl": "private"},
{"success_action_redirect": "http://localhost/"},
["starts-with", "$Content-Type", ""],
["content-length-range", 0, 10485760] --> 10MB
]
}
如果他们尝试上传大于允许限制的文件,AWS会引发如下错误:
<Error>
<Code>EntityTooLarge</Code>
<Message>
Your proposed upload exceeds the maximum allowed size
</Message>
<ProposedSize>1051317</ProposedSize>
<MaxSizeAllowed>1048576</MaxSizeAllowed>
<RequestId>59607868BC81CECC</RequestId>
<HostId>
ABCDEPXYZXYZXYZXYZABCDEPXYZXYZXYZXYZ=
</HostId>
</Error>
希望这有帮助。
答案 1 :(得分:1)
正如Volkan所说,你应该使用S3 POST策略。但问题仍然存在,您如何跟踪用户在其帐户中拥有的数据量?
您无法询问亚马逊,因为他们无法跟踪文件夹大小。但是,在生成发布策略时,您可以通过ajax发送将要上载的文件的大小。然后,您可以在数据库中存储一个数字,用于跟踪用户的总上传大小。将文件大小添加到数字中。如果删除文件,请从编号中删除文件大小。这样,您将拥有用户上传大小的运行日志。
现在,如果他们试图欺骗并发送错误的文件大小,您仍然可以获得它们。只需在帖子政策中设置["content-length-range", fileSize - 1, fileSize + 1]
,如果他们尝试上传不同的文件大小,就会被拒绝!