在 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 用于定义保存目录和文件命名规则。
相关推荐
Allshadow3 天前
Nest.js - 目录结构
javascript·nestjs
南一Nanyi3 天前
依赖注入和控制反转
前端·设计模式·nestjs
晓得迷路了5 天前
栗子前端技术周刊第 138 期 - NestJS 12、Astro 7.1、npm 12...
前端·javascript·nestjs
xiaofeichaichai7 天前
NestJS 实战:JWT 登录认证、Token 刷新与安全退出
redis·nestjs·jwt·twitter
无双_Joney9 天前
[四期 - 4] NestJS专栏 - 征召一下大家的意见,非常想知道大家都想看看Nest的哪些方面
前端·后端·nestjs
糖墨夕10 天前
AI Agent技术栈选择:Vue3 + NestJS + TypeScript 为什么是绝佳组合
前端·nestjs
悟空瞎说22 天前
企业级 NestJS + Prisma 分层架构:单例客户端、生命周期托管与可复用扩展实践
nestjs
悟空瞎说25 天前
NestJS 接口设计避坑:摒弃万能用户更新接口,落地单一职责与最小权限原则
后端·nestjs
光影少年1 个月前
HashRouter 和 BrowserRouter 区别、底层原理、部署差异
前端·react.js·nestjs
悟空瞎说1 个月前
NestJS 12 预览版重磅来袭:全面原生 ESM 正式落地
nestjs