【问题标题】:Best practice to track user storage usage on amazon s3在 amazon s3 上跟踪用户存储使用情况的最佳实践
【发布时间】:2015-09-23 22:12:44
【问题描述】:

我正在构建一个允许用户上传文件的网络应用程序。 我想将单个文件大小限制为

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

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

【问题讨论】:

  • 我不明白,为什么负面评价?我已经搜索了几天,无法得到答案。还是我不够清楚?

标签: amazon-web-services amazon-s3


【解决方案1】:

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

这里有一篇很棒的文章解释了直接上传如何通过一个工作示例进行: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
        ]
    }
    

如果他们尝试上传大于允许限制的文件,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 会因为签名不匹配而拒绝该请求。通过这种方式,您可以计算文件夹的总大小,并根据该数据允许或拒绝上传。您还可以将文件大小设置为允许的剩余限制。

希望这会有所帮助。

【讨论】:

  • 非常感谢您的回答!!但是您如何“计算文件夹的总大小并根据该数据允许或拒绝上传”?对不起,如果这很愚蠢,但我是 S3 的新手,我认为 S3 中的“文件夹”实际上“只是一个概念?”并且实际上只是一个前缀,您能否指出一些资源或告诉我更多有关如何限制文件夹大小的信息?非常感谢!!
  • 是的,你是对的。真的没有文件夹。但是您可以使用文件夹名称作为前缀并根据它过滤对象。 AWS论坛中的一个帖子似乎有一些相关信息:forums.aws.amazon.com/thread.jspa?messageID=661771
  • 所以正如线程指出的那样,每次我想检查文件夹大小时,我都需要遍历所有对象以获得总和。那么您如何执行“允许或拒绝上传”或“将文件大小设置为剩余允许限制”部分?因为如果你让用户直接上传到 S3,他们对他们的文件夹都有读/写访问权限,那么我将如何限制他们呢?
  • 是的,但首先他们会来找你。无论如何,您都会生成上传表单。 (您必须获取他们的用户 ID 和相应的文件夹名称)。因此,在让他们上传之前,您可以前往 AWS 并检查他们到目前为止使用了多少存储空间并据此做出决定。看看这个文档中的图表:docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
  • 所以你的意思是我必须不断监控每个 S3 文件夹并在文件快满时设置文件限制?因为如果我每次在用户想要上传之前都进行检查,如果他们有足够的空间就给他们访问令牌,我不知道他们是否只是拿了令牌并上传了更大的东西?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2021-08-05
    相关资源
    最近更新 更多