用户使用 S3 上传的最佳实践是什么?

use*_*122 5 amazon-s3 amazon-web-services

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

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

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

Nik*_*hil 6

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

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

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

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

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

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

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

bucket_name/user_id/yyyy/mm/dd/unique_name.jpg
Run Code Online (Sandbox Code Playgroud)

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

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