使用 AWS S3 在 node.js 应用程序中处理文件上传和存储
Handling file uploads and storage in a node.js app using AWS S3
我正忙于一个类似 ToDo 的应用程序,我希望用户能够在其中向任务添加附件。
与代码相比,我更纠结于应用程序的架构。
对于我的前端,我使用 Vuejs,Nodejs 作为后端,MongoDB 作为我的数据库,我正在考虑将其托管在 Heroku 上。我正在考虑使用 AWS S3 来存储我的任务的附件。
我不确定我是否应该通过我的节点服务器将文件上传到 S3,或者我是否应该通过预签名的 URL 进行上传。我也不确定从 S3 下载附件的最佳方式是什么,我认为预签名 URL 是最好的方式。
我的主要困惑是如何保留任务的所有附件的索引。将与我的任务模型相关的索引存储在 MongoDB 中是执行此操作的最佳方法吗?还有关于应该存储什么元数据的约定是什么?
最后,我想知道是否有关于如何组织上传到 S3 的文件的约定。将文件保存在任务的数据库 ID 下是否可以?我是否应该更改文件名?
将您的附件存储在 S3 中。我建议您在 S3 中为附件保留一个单独的存储桶,并在名为 Attachments 的 MongoDB collection 中跟踪这些文件。
对于每个文件,您保留以下文档:
{
"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 中的位置。这应该是一个 non-public 桶。这是您生成的文件的 sha256 校验和。您还将其存储为一个单独的实体。最后是上传日期和字节大小。
为什么要进行校验和的开销?自动对文件进行重复数据删除更加安全,并且可以轻松检测 collection.
中已有的上传文件
这意味着您可以通过校验和和名称快速查找文件,并且您可以在将来添加其他鉴别器字段。
上传和下载应由您的应用程序管理。您将此文档的 _id
字段存储在您的任务文档中,以便可以快速检索附件。
最后的优化是将此文档嵌入到您的任务文档中,并节省额外 collection 的复杂性和开销。如果附件与任务的比率较低,请执行此操作。
我正忙于一个类似 ToDo 的应用程序,我希望用户能够在其中向任务添加附件。
与代码相比,我更纠结于应用程序的架构。
对于我的前端,我使用 Vuejs,Nodejs 作为后端,MongoDB 作为我的数据库,我正在考虑将其托管在 Heroku 上。我正在考虑使用 AWS S3 来存储我的任务的附件。
我不确定我是否应该通过我的节点服务器将文件上传到 S3,或者我是否应该通过预签名的 URL 进行上传。我也不确定从 S3 下载附件的最佳方式是什么,我认为预签名 URL 是最好的方式。
我的主要困惑是如何保留任务的所有附件的索引。将与我的任务模型相关的索引存储在 MongoDB 中是执行此操作的最佳方法吗?还有关于应该存储什么元数据的约定是什么?
最后,我想知道是否有关于如何组织上传到 S3 的文件的约定。将文件保存在任务的数据库 ID 下是否可以?我是否应该更改文件名?
将您的附件存储在 S3 中。我建议您在 S3 中为附件保留一个单独的存储桶,并在名为 Attachments 的 MongoDB collection 中跟踪这些文件。
对于每个文件,您保留以下文档:
{
"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 中的位置。这应该是一个 non-public 桶。这是您生成的文件的 sha256 校验和。您还将其存储为一个单独的实体。最后是上传日期和字节大小。
为什么要进行校验和的开销?自动对文件进行重复数据删除更加安全,并且可以轻松检测 collection.
中已有的上传文件这意味着您可以通过校验和和名称快速查找文件,并且您可以在将来添加其他鉴别器字段。
上传和下载应由您的应用程序管理。您将此文档的 _id
字段存储在您的任务文档中,以便可以快速检索附件。
最后的优化是将此文档嵌入到您的任务文档中,并节省额外 collection 的复杂性和开销。如果附件与任务的比率较低,请执行此操作。