在 Nest.js 中实现文件上传
2025年9月3日 15:52
文件上传是后端开发中非常常见的需求,例如用户上传头像、Excel 报表、图片资源等。Nest.js 作为一个基于 TypeScript 的渐进式 Node.js 框架,提供了开箱即用的上传支持,并且与 Multer
中间件深度集成。
本文将介绍 Nest.js 中文件上传的实现方式。
1. 文件上传的原理
Nest.js 本身并不直接处理文件,而是通过 Multer 来解析 multipart/form-data
类型的请求。Nest.js 提供了内置的拦截器(Interceptor),可以很方便地将上传逻辑融入到控制器中。
核心要点:
- 使用
@UseInterceptors()
配合FileInterceptor
或FilesInterceptor
。 - 上传后的文件会自动保存到磁盘(或内存),并在控制器方法中以参数形式注入。
- 可以自定义存储路径、文件名、过滤器等。
2. 单文件上传
首先安装依赖:
npm install @nestjs/platform-express multer
控制器代码示例:
import {
Controller,
Post,
UploadedFile,
UseInterceptors,
} from "@nestjs/common";
import { FileInterceptor } from "@nestjs/platform-express";
import { diskStorage } from "multer";
import { extname } from "path";
@Controller("upload")
export class UploadController {
@Post("single")
@UseInterceptors(
FileInterceptor("file", {
storage: diskStorage({
destination: "./uploads", // 文件保存路径
filename: (req, file, callback) => {
const uniqueSuffix =
Date.now() + "-" + Math.round(Math.random() * 1e9);
callback(null, `${uniqueSuffix}${extname(file.originalname)}`);
},
}),
limits: { fileSize: 5 * 1024 * 1024 }, // 限制 5MB
})
)
uploadSingle(@UploadedFile() file: Express.Multer.File) {
return {
filename: file.filename,
path: file.path,
};
}
}
说明:
-
FileInterceptor('file')
对应前端表单里的name="file"
。 -
diskStorage
用于定义保存目录和文件命名规则。