在 TypeScript 中使用 S3 和云存储:库、配置与代码示例
兼容 Amazon S3 API 的云对象存储已成为现代 Web 应用中文件存储和分发的实际标准。在 TypeScript 和 Node.js 生态系统中,有几种强大的工具可用于处理 S3。在本文中,我们将介绍主要的库、它们的配置,并提供常见任务(上传、下载、删除文件和管理存储桶)的实用代码示例。
在 TypeScript 中使用 S3 的主要库
最流行且官方的解决方案是 AWS SDK for JavaScript v3。该库完全用 TypeScript 重写,模块化且支持 tree-shaking。替代方案是 MinIO JavaScript Client——一个轻量级库,完全兼容 S3 API,非常适合与本地或自托管的 S3 兼容存储(例如 MinIO、Ceph、DigitalOcean Spaces)一起使用。
对于简单场景,还可以使用 @aws-sdk/client-s3——AWS SDK v3 中的一个独立包,仅包含 S3 所需的功能。
安装与初始化
通过 AWS SDK v3 安装用于 S3 的主要包:
npm install @aws-sdk/client-s3 @aws-sdk/credential-providers用于 MinIO:
npm install minio使用 AWS SDK v3 初始化 S3 客户端的示例:
import { S3Client } from "@aws-sdk/client-s3";import { fromEnv } from "@aws-sdk/credential-providers";
const s3Client = new S3Client({ region: "us-east-1", credentials: fromEnv(), // 使用环境变量中的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY});MinIO 客户端的配置如下:
import * as Minio from "minio";
const minioClient = new Minio.Client({ endPoint: "play.min.io", port: 9000, useSSL: true, accessKey: "YOUR_ACCESS_KEY", secretKey: "YOUR_SECRET_KEY",});类型化与严格类型
TypeScript 的主要优势之一是严格的类型化。这两个库都为所有请求和响应提供了完整的类型。例如,在将文件上传到 S3 时,您会获得所有参数的自动补全:
import { PutObjectCommand } from "@aws-sdk/client-s3";
const uploadParams: PutObjectCommand["input"] = { Bucket: "my-bucket", Key: "uploads/photo.jpg", Body: fileBuffer, ContentType: "image/jpeg", ACL: "public-read",};
const command = new PutObjectCommand(uploadParams);const result = await s3Client.send(command);主要操作:上传、下载、删除
1. 上传文件 (Upload)
import { PutObjectCommand } from "@aws-sdk/client-s3";
async function uploadFile(bucket: string, key: string, body: Buffer | Uint8Array | string) { const command = new PutObjectCommand({ Bucket: bucket, Key: key, Body: body, }); return await s3Client.send(command);}
// 使用示例const buffer = Buffer.from("Hello, S3!");await uploadFile("my-bucket", "hello.txt", buffer);2. 下载文件 (Download)
import { GetObjectCommand } from "@aws-sdk/client-s3";
async function downloadFile(bucket: string, key: string): Promise<Buffer> { const command = new GetObjectCommand({ Bucket: bucket, Key: key }); const response = await s3Client.send(command); return Buffer.from(await response.Body!.transformToByteArray());}
// 示例const fileContent = await downloadFile("my-bucket", "hello.txt");console.log(fileContent.toString());3. 删除文件
import { DeleteObjectCommand } from "@aws-sdk/client-s3";
async function deleteFile(