【问题标题】:Handling file uploads and storage in a node.js app using AWS S3使用 AWS S3 在 node.js 应用程序中处理文件上传和存储
【发布时间】:2020-05-11 20:52:35
【问题描述】:

我正忙于一个类似 ToDo 的应用,我希望用户能够在其中向任务添加附件。

比起代码,我更苦恼于应用的架构。

对于我的前端,我使用 Vuejs,Nodejs 作为后端,MongoDB 作为我的数据库,我正在考虑将其托管在 Heroku 上。我正在考虑使用 AWS S3 来存储我的任务的附件。

我不确定是否应该通过我的节点服务器将文件上传到 S3,或者是否应该通过预签名的 URL 进行上传。另外我不确定哪种是从 S3 下载附件的最佳方式,我认为预签名的 URL 将是最好的方式。

我的主要困惑是如何保留任务的所有附件的索引。在 MongoDB 中存储与我的 Task 模型相关的索引是最好的方法吗?还有哪些关于应该存储哪些元数据的约定?

最后,我想知道关于如何组织上传到 S3 的文件是否有任何约定。将文件保存在任务的数据库 ID 下是否可以?我应该更改文件名吗?

【问题讨论】:

    标签: node.js mongodb amazon-web-services amazon-s3 cloud-storage


    【解决方案1】:

    将您的附件存储在 S3 中。我建议您在 S3 中为附件保留一个单独的存储桶,并在名为 Attachments 的 MongoDB 集合中跟踪这些文件。

    对于每个文件,您保留以下文档:

    {
      "source_name" : "helloworld.txt"
      "s3_url" : "https://bucket-name.s3-eu-west-1.amazonaws.com/A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E"
      "sha256" : "A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E"
      "uploaded" : "Mon May 11 2020 13:40:28" #  Alway UTC time
      "size" : 12
    }
    

    source_name 是已上传文件的名称。 s3_url 是 S3 中的位置。这应该是一个非公共存储桶。这是您生成的文件的 sha256 校验和。您还可以将其存储为单独的实体。最后是上传日期和大小(以字节为单位)。

    为什么要使用校验和的开销?自动删除文件的重复数据更加安全,并且您可以轻松检测您收藏中已有的上传文件。

    这意味着您可以通过校验和和名称快速查找文件,并且将来可以添加其他鉴别器字段。

    上传和下载应由您的应用程序管理。您将此文档的_id 字段存储在您的任务文档中,以便可以快速检索附件。

    最后的优化是将此文档嵌入到您的任务文档中,并节省额外集合的复杂性和开销。如果附件与任务的比率较低,请执行此操作。

    【讨论】:

    • 感谢您的明确答复。校验和部分对我来说非常有趣,以便自动删除文件。我只是想知道如果存储的文件类型没有扩展名,我将如何知道存储的文件类型?另外,当你说上传/下载应该由我的应用程序管理时,我假设那是 nodejs 后端?谢谢
    • 是的,您的后端会处理。文件类型应该从上传中的 MIME 类型推断出来,或者您可以从扩展名中猜测。这也应该存储起来,以便您知道以后如何处理该文件。为了清楚起见,我忽略了该字段。
    猜你喜欢
    • 2010-12-12
    • 2022-10-17
    • 2018-08-29
    • 1970-01-01
    • 2019-04-28
    • 2019-03-13
    • 2019-03-18
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多