使用S3上传用户的最佳做法是什么?

时间:2014-06-09 05:09:13

标签: amazon-web-services amazon-s3

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  1. 如果您发现自己想要做的事情 - “特定日期的所有用户上传” - 一个简单的命名约定,包含年,月,日文件夹以及顶级文件夹,供用户使用唯一ID将解决问题。

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

  3. 然而,既然你已经拥有MongoDB(我假设)实际上会按日期等方式处理这些用户上传的查询,那么它使你的桶的选择更加美观而不是功能。

    如果你在mongoDB中存储的只是密钥/ URL,那么你的存储桶的实际结构并不重要。尽管如此,仍然有必要以一种连贯的方式对其进行拆分 - 可能将所有用户的上传组合在一起并为每个用户提供一个唯一的名称(生成唯一的名称或为文件名前缀添加唯一的前缀)。

    话虽如此,您是否认为可能有一点可以改变图像的存储方式?你可能会转向CDN。第三方可能会想出一个更便宜/更好的产品,您可能想尝试一下。在这种情况下,只需将密钥/ URL存储在MongoDB中就不是一个好主意,因为您必须更新每个条目。

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

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

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

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