【问题标题】:What are the best practices for user uploads with S3?使用 S3 进行用户上传的最佳实践是什么?
【发布时间】:2014-06-09 15:26:00
【问题描述】:

我想知道您建议使用 s3 运行用户上传系统。我打算使用 MongoDB 存储元数据,例如上传器、大小等。我应该如何将实际文件存储在 s3 中。

这是我的一些想法,你认为什么是最好的?所有这些示例都涉及将元数据保存到 MongoDB。

1.我应该将所有文件存储在一个存储桶中吗?
2. 也许将它们组织成日期(例如 6/8/2014/mypicture.png)?
3.我是否应该将它们全部保存在一个存储桶中,但要添加一个字符串(例如 d1JdaZ9-mypicture.png)以避免重复。
4. 或者我应该为一个文件夹生成一个长字符串,并将文件存储在该文件夹中。 (保留原始文件名)。例如sh8sb36zkj391k4dhqk4n5e4ndsqule6/mypicture.png

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    这主要取决于您打算如何使用图片以及哪些对象/类/模块/等。在您的代码中实际上将处理检索它们。

    1. 如果您发现自己想要执行诸如“所有用户在特定日期上传”之类的操作 - 一个简单的命名约定,其中包含年、月和日的文件夹以及用户的顶级文件夹唯一 ID 将解决问题。

    2. 如果您想确保存储桶中的唯一性并避免冲突,您也可以生成一个唯一的字符串。

    但是,由于您拥有 MongoDB,它(我假设)实际上会按日期处理用户上传的这些查询,等等,它使您的存储桶的选择更美观而不是功能。

    如果您在 mongoDB 中存储的只是密钥/URL,那么您的存储桶的实际结构是什么并不重要。尽管如此,仍然以某种连贯的方式将其拆分是有意义的 - 可能将所有用户上传的内容分组并给每个人一个唯一的名称(生成一个唯一的名称或为文件名添加一个唯一的前缀)。

    话虽如此,您是否认为有必要考虑更改图像的存储方式?您可能会转移到 CDN。第三方可能会提供您可能想尝试的更便宜/更好的产品。在这种情况下,简单地将键/URL 存储在 MongoDB 中并不是一个好主意,因为您必须更新每个条目。

    为了使这个相对面向未来,我建议您为您的上传设置一个明确的结构。我通常选择:

    bucket_name/user_id/yyyy/mm/dd/unique_name.jpg
    

    然后您的数据库只需要存储文件名和上传时间戳。

    您可以在逻辑中引入一个中间层(可能是一个新类,或者只是一个辅助函数/方法),然后根据此信息生成文件的 URL。这样,如果你以后改变你的存储方式,你只需要在这个中间层做一个小的改变(当然是在迁移你的文件之后),而不用担心 MongoDB。

    【讨论】:

    • 感谢您的详尽回复!我有一个类似的用例,但我也试图确保当用户删除上传时,他们会从 S3 中删除。在尝试自己找到解决方案无济于事后,我在 SO 上发布了一个问题:stackoverflow.com/questions/70035485/… 如果您有保持数据库和对象存储同步的想法,我将不胜感激!
    猜你喜欢
    • 2013-01-07
    • 2011-03-17
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2018-10-21
    • 2015-12-12
    相关资源
    最近更新 更多