NestJS - 如何将图像上传到 aws s3

作者:编程家 分类: typescript 时间:2025-06-18

如何使用NestJS将图像上传到AWS S3

在现代的Web应用程序中,图像上传是一个常见的需求。本教程将向您展示如何使用NestJS将图像上传到AWS S3存储服务。AWS S3是一个可扩展的对象存储服务,它可以存储和检索任意数量的数据。

在本教程中,我们将使用NestJS框架来构建后端API,并使用Multer中间件来处理图像上传。同时,我们将使用aws-sdk包来与AWS S3进行通信。

步骤1:设置AWS S3存储桶

首先,您需要在AWS S3中创建一个存储桶。打开AWS管理控制台,并导航到S3服务。点击“创建存储桶”,然后按照提示填写必要的信息,如存储桶名称、区域等。

完成存储桶创建后,您将获得一个访问密钥ID和秘密访问密钥。请记住这些凭据,因为我们将在后面的步骤中使用它们。

步骤2:初始化NestJS项目

在继续之前,确保您已经安装了Node.js和NPM。然后,打开终端并运行以下命令来全局安装NestJS CLI:

npm install -g @nestjs/cli

安装完成后,我们可以使用以下命令来创建一个新的NestJS项目:

nest new image-upload

进入项目目录:

cd image-upload

步骤3:安装必要的依赖

我们需要安装Multer和aws-sdk这两个包来处理图像上传和与AWS S3进行通信。运行以下命令来安装这些依赖:

npm install multer aws-sdk

安装完成后,我们可以开始编写代码。

步骤4:配置AWS S3凭证

在项目根目录下创建一个名为`.env`的文件,并添加以下内容:

AWS_ACCESS_KEY_ID=your_access_key_id

AWS_SECRET_ACCESS_KEY=your_secret_access_key

AWS_BUCKET_NAME=your_bucket_name

请将`your_access_key_id`、`your_secret_access_key`和`your_bucket_name`替换为您在步骤1中获得的凭证和存储桶名称。

接下来,我们需要在项目的根目录下创建一个名为`aws.config.js`的文件,并添加以下内容:

javascript

const AWS = require('aws-sdk');

AWS.config.update({

accessKeyId: process.env.AWS_ACCESS_KEY_ID,

secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,

});

const s3 = new AWS.S3();

module.exports = s3;

这将创建一个AWS S3实例,并将其导出以供后面使用。

步骤5:创建图像上传模块

在NestJS中,我们使用模块来组织应用程序的不同部分。我们将创建一个名为`upload`的模块来处理图像上传。

首先,我们需要在项目的根目录下创建一个名为`upload`的文件夹。然后,在`upload`文件夹中创建一个名为`upload.module.ts`的文件,并添加以下内容:

typescript

import { Module } from '@nestjs/common';

import { MulterModule } from '@nestjs/platform-express';

import { UploadController } from './upload.controller';

import { UploadService } from './upload.service';

@Module({

imports: [

MulterModule.register({

dest: './uploads',

}),

],

controllers: [UploadController],

providers: [UploadService],

})

export class UploadModule {}

这将创建一个包含Multer模块的NestJS模块,并将其导出以供其他地方使用。

步骤6:创建图像上传服务

接下来,我们将创建一个名为`upload.service.ts`的文件,并添加以下内容:

typescript

import { Injectable } from '@nestjs/common';

import { S3 } from 'aws-sdk';

import { v4 as uuidv4 } from 'uuid';

@Injectable()

export class UploadService {

async uploadImage(file: Express.Multer.File): Promise {

const s3 = require('../../aws.config');

const key = `${uuidv4()}_${file.originalname}`;

const params: S3.Types.PutObjectRequest = {

Bucket: process.env.AWS_BUCKET_NAME,

Key: key,

Body: file.buffer,

ACL: 'public-read',

};

await s3.upload(params).promise();

return key;

}

}

这将创建一个名为`UploadService`的NestJS服务,并包含一个名为`uploadImage`的方法来处理图像上传。在该方法中,我们首先加载AWS S3实例,然后生成一个唯一的键,将图像文件上传到AWS S3,并返回生成的键。

步骤7:创建图像上传控制器

最后,我们将创建一个名为`upload.controller.ts`的文件,并添加以下内容:

typescript

import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';

import { FileInterceptor } from '@nestjs/platform-express';

import { UploadService } from './upload.service';

@Controller('upload')

export class UploadController {

constructor(private readonly uploadService: UploadService) {}

@Post()

@UseInterceptors(FileInterceptor('image'))

async uploadImage(@UploadedFile() file: Express.Multer.File): Promise<{ imageUrl: string }> {

const imageUrl = await this.uploadService.uploadImage(file);

return { imageUrl };

}

}

这将创建一个名为`UploadController`的NestJS控制器,并包含一个名为`uploadImage`的方法来处理POST请求。在该方法中,我们使用`FileInterceptor`中间件来处理图像上传,并调用`UploadService`中的`uploadImage`方法来上传图像。

步骤8:启动应用程序

现在,我们的NestJS应用程序已经准备就绪。在终端中,运行以下命令来启动应用程序:

npm run start

访问`http://localhost:3000/upload`,您将看到一个上传图像的界面。选择一个图像文件并上传,应用程序将将图像上传到AWS S3,并返回图像的URL。

通过本教程,您学会了如何使用NestJS将图像上传到AWS S3。首先,我们设置了AWS S3存储桶,并获得了必要的凭证。然后,我们使用NestJS框架和Multer中间件构建了一个后端API,用于处理图像上传。最后,我们使用aws-sdk包与AWS S3进行通信,并将图像上传到存储桶。

这个例子只是一个简单的演示,您可以根据实际需求进行修改和扩展。希望这个教程对您有所帮助!