跟踪亚马逊s3上用户存储使用情况的最佳做法

时间:2015-09-23 22:12:44

标签: amazon-web-services amazon-s3

我正在构建一个允许用户上传文件的网络应用。 我想限制单个文件大小说< 100 MB,并将用户的使用情况跟踪到一定数量(非常像Dropbox)。如果达到限制,他们就无法上传,或者他们可以支付更高的费用以上限。

让用户直接上传到AWS S3(或者如果存在任何差异,可能是谷歌云存储......)是一个好习惯吗?我看到有人说直接上传大大降低了服务器负载,但却无法跟踪用户的使用情况?

如果我让用户直接上传到S3,有没有办法或解决用户使用情况? 如果没有,我如何流式传输或重定向文件以从用户上传到Web服务器,然后上传到S3,并跟踪每个用户的使用情况?

2 个答案:

答案 0 :(得分:2)

您可以允许直接上传并跟踪每个用户的上传,也可以限制文件大小。

这里有一篇很棒的文章解释了直接上传如何在一个工作示例上运行:Browser Uploads to S3 using HTML POST Forms

所以要解决你的问题:

  1. 您可以限制文件大小。您只需在政策中指定它:

    {
        "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
        ]
    }
    
  2. 如果他们尝试上传大于允许限制的文件,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. 要跟踪用户上传的总大小,您可以为上面指定的每个用户创建一个单独的文件夹,然后签署该路径。客户端无法更改该路径,因为它使用密钥签名,AWS会因签名不匹配而拒绝该请求。这样,您可以计算文件夹的总大小,并根据该数据允许或拒绝上传。您还可以将文件大小设置为剩余允许限制。
    2. 希望这有帮助。

答案 1 :(得分:1)

正如Volkan所说,你应该使用S3 POST策略。但问题仍然存在,您如何跟踪用户在其帐户中拥有的数据量?

您无法询问亚马逊,因为他们无法跟踪文件夹大小。但是,在生成发布策略时,您可以通过ajax发送将要上载的文件的大小。然后,您可以在数据库中存储一个数字,用于跟踪用户的总上传大小。将文件大小添加到数字中。如果删除文件,请从编号中删除文件大小。这样,您将拥有用户上传大小的运行日志。

现在,如果他们试图欺骗并发送错误的文件大小,您仍然可以获得它们。只需在帖子政策中设置["content-length-range", fileSize - 1, fileSize + 1],如果他们尝试上传不同的文件大小,就会被拒绝!