Filesystems
使用 amazon S3 作為 Web 郵件系統中的附件儲存
我希望將 S3 用作郵件系統的數據儲存服務。
這個想法是允許使用者上傳作為電子郵件附件的文件,然後可以通過指向 S3 上託管的文件的連結從 Web 服務下載這些文件。
我面臨的問題:
- 當使用者選擇文件名時,會有衝突,所以 S3 上的文件必須具有唯一生成的文件名,或者儲存在單獨的文件夾中,使用者可以使用某些 API 或配置下載原始文件名的文件嗎?
(範例:使用者上傳文件 dog.gif,儲存在儲存桶中為 A3f23_dog.gif,下載連結返回文件為 dog.gif,可能使用 HTTP 標頭) 2. 單個儲存桶(根目錄)中包含的文件/文件夾的數量是否會對性能產生影響?或者我是否需要將文件分發到文件夾等。 3. 我可以使用 URL 公開文件,同時仍然不允許列舉儲存桶中的文件嗎?(即文件列表)
非常感謝,我希望這是有道理的。
我最近設計了一個類似的系統來儲存報告——這是我們發現執行良好的系統:
- 在您的鍵中使用“/”來創建結構化的層次結構。在你的情況下,我會做類似的事情
<user-id>/<year>/<month>/<day>/<message-id>/<user-defined-filename>
:- 使用預簽名的 url僅向有權訪問已發送電子郵件的使用者提供對 S3 中文件的訪問權限。
(1) 的要點是確保您不會在使用者之間發生衝突——您可以根據自己的喜好重新建構層次結構,但關鍵是要在密鑰結構中使用唯一標識符(在這種情況下, user-id 和 message-id),同時保持原始文件名作為結構的最後一部分;結構的最後一部分是大多數瀏覽器用作下載文件的名稱。
請注意,我將日期作為結構的一部分包含在內——如果您將擁有大量對象,您將希望將它們分隔到 S3 密鑰空間中的虛擬“文件夾”中,這樣您就不必每次需要手動查找文件時都要等待。
第 (2) 點僅向消息的收件人提供對文件的訪問權限。只有儲存桶的所有者(您)才能列出文件(除非您明確授予不同的權限),但任何擁有文件連結的人都可以訪問它。
如果您想添加對連結的更多控制,請創建引導使用者通過您的應用程序的連結,然後如果您的應用程序確定使用者實際上已獲得授權,請創建一個預簽名的 url 並將其提供給使用者。(通過這種方式,您可以分發有時間限制的預簽名網址,因此您不只是通過連結提供完整的永久訪問權限。)