logo

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

774
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({
    s3,
    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,提供灵活性。
  • 流式传输: 能够处理传入数据流,非常适合高效处理大文件。
  • 定制: 对解析过程提供细粒度控制,支持自定义逻辑。
  • 最小依赖: 通过最小的外部依赖保持项目轻量级。
  • 广泛采用: 是Node.js社区中一个成熟的库。

根据项目的要求和库的熟悉程度选择Multer和Formidable。Multer非常适合与Express无缝集成、内置验证和直接的方法。当您需要更多定制、多功能性或用于大文件的流式传输能力时,可以选择Formidable。

结论

总之,本文演示了如何开发Node.js TypeScript应用程序,通过流式传输高效地将大型数据集上传到Amazon S3。流式传输是一种内存高效且可扩展的方法,特别适用于处理大量数据。遵循本指南中概述的步骤可以增强您的数据上传能力,并构建更健壮的应用程序。

本文链接:https://www.iokks.com/art/24b2be2527cd
本博客所有文章除特别声明外,均采用CC BY 4.0 CN协议 许可协议。转载请注明出处!