我想知道您建议如何使用s3运行用户上传系统。我计划使用MongoDB存储元数据,如上传器,大小等。我该如何将实际文件存储在s3中呢?
这是我的一些想法,你觉得哪个最好?所有这些例子都涉及到将元数据保存到MongoDB。 1。我应该把所有文件都存储在一个存储桶里吗?
2. 或者将它们组织成日期(例如6/8/2014/myppicture .png)?
3.我是否应该将它们全部保存在一个桶中,但添加字符串(例如d1jdaz9 - myppicture .png)以避免重复?
4. 或者我应该为文件夹生成一个长字符串,并将文件存储在该文件夹中。(保留原来的文件名)。例如sh8sb36zkj391k4dhqk4n5e4ndsqule6/mypicture.png
这主要取决于您打算如何使用图片以及使用哪些对象/类/模块等。在你的代码中将实际处理检索它们。
-
如果你发现自己想要做这样的事情-"所有用户在特定的一天上传"-一个简单的命名约定与文件夹的年,月和日以及一个文件夹的顶部用户的唯一ID将解决这个问题。
-
如果你想确保唯一性并避免bucket中的冲突,你也可以生成一个唯一的字符串
然而,因为你有MongoDB(我假设)将实际处理这些查询用户上传的日期等,它使你的桶的选择更美观而不是功能。
如果你在mongoDB中存储的是键/URL,那么你的桶的实际结构是什么并不重要。尽管如此,以某种连贯的方式将其拆分仍然是有意义的-可能将用户的所有上传分组并为每个用户提供唯一的名称(生成唯一的名称或为文件名添加唯一的前缀)。
话虽如此,你是否认为你可能会考虑改变你的图像存储方式?您可能会转向CDN。第三方可能会提出一个更便宜/更好的产品,你可能会想尝试一下。在这种情况下,简单地将键/url存储在MongoDB中并不是一个好主意,因为您必须更新每个条目。
为了使这个相对未来的证明,我建议你给你的上传一个明确的结构。我通常选择:
bucket_name/user_id/yyyy/mm/dd/unique_name.jpg
你的数据库只需要存储文件名和上传时间戳。
你可以在你的逻辑中引入一个中间层(也许是一个新的类,或者只是一个辅助函数/方法),然后根据这个信息为文件生成URL。这样,如果以后更改存储方法,只需要在中间层中做一个小的更改(当然是在迁移文件之后),而不用担心MongoDB。