在 Nest.js 中实现文件上传

文件上传是后端开发中非常常见的需求,例如用户上传头像、Excel 报表、图片资源等。Nest.js 作为一个基于 TypeScript 的渐进式 Node.js 框架,提供了开箱即用的上传支持,并且与 Multer 中间件深度集成。

本文将介绍 Nest.js 中文件上传的实现方式。


1. 文件上传的原理

Nest.js 本身并不直接处理文件,而是通过 Multer 来解析 multipart/form-data 类型的请求。Nest.js 提供了内置的拦截器(Interceptor),可以很方便地将上传逻辑融入到控制器中。

核心要点:

  • 使用 @UseInterceptors() 配合 FileInterceptorFilesInterceptor
  • 上传后的文件会自动保存到磁盘(或内存),并在控制器方法中以参数形式注入。
  • 可以自定义存储路径、文件名、过滤器等。

2. 单文件上传

首先安装依赖:

bash 复制代码
npm install @nestjs/platform-express multer

控制器代码示例:

ts 复制代码
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 用于定义保存目录和文件命名规则。
相关推荐
To_OC9 小时前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
__zRainy__1 天前
Node.js Web 框架选型指南:从 Express 到 Hono 的全景对比
前端·node.js·express·koa·nestjs·egg·fastify
Darling噜啦啦2 天前
NestJS 全栈 CRUD 实战:从 Module 拆分到 RESTful 七大装饰器,彻底搞懂后端接口工程
nestjs
嘟嘟07172 天前
从入口到 CRUD:用 NestJS 的模块化与装饰器思想读懂一个后端应用
后端·typescript·nestjs
想要成为糕糕手2 天前
🚀 NestJS 完全入门指南: Module/Controller/Service讲解 + 实战 CRUD
后端·nestjs
想要成为糕糕手2 天前
🏭 设计模式之工厂模式:从蜜雪冰城到 NestJS,把「new」外包出去
后端·nestjs
小月土星2 天前
用设计哲学的眼光重新审视 NestJS——一个 AI 应用后端的思考
nestjs
触底反弹2 天前
🔥 NestJS 从零到实战:一个 Todos CRUD 搞懂企业级后端框架的核心设计
后端·typescript·nestjs
只一2 天前
吃透 NestJS 核心|工厂模式 + 依赖注入 + Todo CRUD 实战,后端入门到上手
nestjs
Asize2 天前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs