添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
logo

解锁流媒体的力量:使用Node.js轻松上传千兆字节数据到AWS S3

523
2023年11月23日
本文指导您构建一个Node.js应用程序,用于高效地将数据上传到Amazon S3,包括设置、集成和数据库存储。

上传大规模数据到Amazon S3可能令人望而生畏,尤其是在处理大量信息时。然而,我们可以通过利用Node.js TypeScript应用程序的流式传输能力来解决这个问题。流式传输使我们能够以非凡的效率将大量数据传输到AWS S3,同时节约内存资源并确保可扩展性。在本文中,我们将踏上一段旅程,揭示开发Node.js TypeScript应用程序的秘密,通过流式传输无缝地将大量数据上传到AWS S3的方法。

设置Node.js应用程序

让我们从设置一个新的Node.js项目开始:

mkdir aws-s3-upload
cd aws-s3-upload
npm init -y

接下来,安装必要的依赖项:

npm install aws-sdk axios
npm install --save-dev @types/aws-sdk @types/axios typescript ts-node
npm install --save-dev @types/express @types/multer multer multer-s3

配置AWS SDK和Multer

在这一部分,我们将配置AWS SDK以便与Amazon S3进行通信。确保您已准备好AWS凭据。

import { S3 } from 'aws-sdk';
import multer from 'multer';
import multerS3 from 'multer-s3';
import { v4 as uuidv4 } from 'uuid';
const app = express();
const port = 3000;
const s3 = new S3({
  accessKeyId: 'YOUR_AWS_ACCESS_KEY_ID',
  secretAccessKey: 'YOUR_AWS_SECRET_ACCESS_KEY',
  region: 'YOUR_AWS_REGION',
});

我们还将设置Multer来直接处理文件上传到S3。定义存储配置并创建一个上传中间件实例。

const upload = multer({
  storage: multerS3({
    bucket: 'YOUR_S3_BUCKET_NAME',
    contentType: multerS3.AUTO_CONTENT_TYPE,
    acl: 'public-read',
    key: (req, file, cb) => {
      cb(null, `uploads/${uuidv4()}_${file.originalname}`);
  }),
});

创建文件上传端点

现在,让我们创建一个用于处理文件上传的POST端点:

app.post('/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ message: 'No file uploaded' });
  const uploadedFile = req.file;
  console.log('File uploaded successfully. S3 URL:', uploadedFile.location);
  res.json({
    message: 'File uploaded successfully',
    url: uploadedFile.location,
  });
});

测试应用程序

要测试应用程序,您可以使用Postman或cURL等工具。确保将 Content-Type 标头设置为 multipart/form-data ,并在请求正文中包含一个字段名为'file'的文件。

选择数据库存储和云存储之间的区别

将文件存储在数据库还是S3存储桶取决于您的具体用例和要求。以下是一个简要概述:

数据库存储

  • 数据完整性: 适用于确保数据完整性和结构化数据与关联文件之间的一致性,得益于ACID事务。
  • 安全性: 提供细粒度的访问控制机制,包括基于角色的访问控制。
  • 文件大小: 在性能和存储成本方面适用于中小型文件。
  • 事务性工作流程: 适用于涉及结构化数据和文件的复杂事务的应用程序。
  • 备份和恢复: 便于将文件包含在数据库备份和恢复过程中。
  • S3存储桶存储

  • 可扩展性: 适用于大文件和高效的文件存储,可扩展到大量数据的千兆字节、太字节或拍字节。
  • 性能: 优化了快速文件存储和检索,特别是对于大型媒体文件或二进制数据。
  • 成本效益: 相对于数据库,对大量数据具有具有竞争力的价格。
  • 简单性: 提供直观的文件管理、版本控制和通过公共或签名URL轻松共享。
  • 用例: 通常用于存储静态资产和内容交付,并作为Web和移动文件上传的可扩展后端。
  • 耐久性和可用性: 确保高数据耐久性和可用性,适用于关键数据存储。
  • 混合方法: 在某些情况下,元数据和文件的引用存储在数据库中,而实际文件存储在S3存储桶中,结合了两种方法的优势。

    选择应与您的应用程序需求保持一致,考虑文件大小、数量、性能要求、数据完整性、访问控制和预算限制等因素。

    Multer vs. Formidable — 选择合适的文件上传中间件

    在构建基于Express的Node.js应用程序时,选择合适的文件上传中间件至关重要。让我们比较两个流行的选项:Multer和Formidable。

    Multer与Express

  • Express集成: 与Express无缝集成,易于设置和使用。
  • 抽象层: 提供了更高级别的抽象,用于处理文件上传,减少样板代码。
  • 中间件链: 轻松适配到Express中间件链中,在特定路由或端点上实现选择性使用。
  • 文件验证: 支持内置文件验证,增强对上传内容的安全性和控制。
  • 多文件上传: 在单个请求中高效处理多个文件上传。
  • 文档和社区: 受益于广泛的文档和活跃的社区。
  • 文件重命名和存储控制: 允许自定义文件命名约定和存储位置。
  • Formidable与Express

  • 多功能性: 在各种HTTP服务器环境中工作,不限于Express,提供灵活性。
  • 流式传输: 能够处理传入数据流,非常适合高效处理大文件。
  • 定制: 对解析过程提供细粒度控制,支持自定义逻辑。
  •