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

5

我想知道您对使用s3运行用户上传系统的建议。 我打算使用MongoDB存储元数据,如上传者、大小等。 那么我该如何在s3中存储实际文件呢?

以下是我的一些想法,请问您认为哪个最好?所有这些示例都将元数据保存到MongoDB中。

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

1个回答

5
这主要取决于您打算如何使用图片以及哪些对象/类/模块等在您的代码中将实际处理它们的检索。
1. 如果您希望执行诸如“某特定日期的所有用户上传”之类的操作,那么通过具有文件夹的简单命名约定来解决问题。其中顶层为用户唯一ID,年、月和日分别作为子文件夹。
2. 如果您想确保存储桶中的唯一性并避免碰撞,则可以生成一个唯一的字符串。
然而,既然您已经拥有了MongoDB,(我假设)它将实际处理这些关于用户上传的查询等,那么您选择存储桶更多是出于美学考虑而不是功能性考虑。
如果在mongoDB中存储的是键/URL,则实际存储桶的结构并不重要。尽管如此,仍然有必要以某种连贯的方式进行划分 - 可以将一个用户的所有上传分组并为每个上传分配唯一的名称(或者生成唯一名称或为文件名添加唯一前缀)。
话虽如此,您是否认为会有一点需要改变图像的存储方式?您可能会转移到CDN,第三方可能会推出更便宜/更好的产品,您可能想要尝试。在这种情况下,仅将键/ URL存储在MongoDB中不是一个好主意,因为您需要更新每个条目。
为了使其相对未来可靠,建议您为上传文件定义一个明确的结构。我通常选择以下方式:
bucket_name/user_id/yyyy/mm/dd/unique_name.jpg

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

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


非常感谢您的详细回复!我有一个类似的用例,但我也想确保当用户删除上传时,它们会从S3中删除。在自己尝试无果后,我在SO上发布了一个问题:https://stackoverflow.com/questions/70035485/how-to-store-and-reference-user-uploads-in-aws-s3-using-mongodb 如果您对保持数据库和对象存储同步有任何想法,我将不胜感激! - Bianca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接