我正在考虑将 S3 用作邮件系统的数据存储服务。
这个想法是让用户上传文件作为电子邮件的附件,然后可以通过 S3 上托管的文件链接从 Web 服务下载这些文件。
我面临的问题:
当用户选择文件名时,就会发生冲突,因此 S3 上的文件必须具有唯一生成的文件名,或者存储在单独的文件夹中,用户是否仍可以使用某些 API 或配置下载具有原始文件名的文件?
(例如:用户上传文件 dog.gif,在存储桶中存储在 A3f23_dog.gif 中,下载链接返回文件为 dog.gif,可能使用 HTTP 标头)单个存储桶(在根目录上)中包含的文件/文件夹数量会对性能产生影响吗?或者我是否需要将文件分发到文件夹等。
我是否可以使用 URL 公开文件,但仍然不允许枚举存储桶中的文件?(即文件列表)
非常感谢,我希望这是有意义的。
答案1
我最近设计了一个类似的系统来存储报告——我们发现它运行良好:
- 在键中使用“/”来创建结构化层次结构。对于你的情况,我会这样做:
<user-id>/<year>/<month>/<day>/<message-id>/<user-defined-filename>
。 - 用一个预签名 URL仅向有权访问已发送电子邮件的用户提供对 S3 中文件的访问权限。
(1) 的要点是确保用户之间不会发生冲突——您可以按照自己喜欢的方式重组层次结构,但关键点是将唯一标识符作为关键结构的一部分(在本例中为用户 ID 和消息 ID),同时将原始文件名保留为结构的最后一部分;大多数浏览器都使用结构的最后一部分作为下载文件的名称。
请注意,我将日期作为结构的一部分 - 如果您要拥有大量对象,您将需要将它们分成 S3 键空间中的虚拟“文件夹”,这样您不必每次需要手动查找文件时都等待很长时间。
第 (2) 点仅向消息的收件人提供对文件的访问权限。只有存储桶的所有者(您)才能列出文件(除非您明确授予不同的权限),但任何拥有文件链接的人都可以访问它。
如果您想对链接进行更多控制,请创建引导用户浏览应用程序的链接,然后如果您的应用程序确定用户确实获得授权,请创建一个预签名的 URL 并将其提供给用户。(这样,您可以分发有时间限制的预签名 URL,这样您就不会仅仅通过链接提供完全永久的访问权限。)