You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NestJs和TypeScript上传Excel文件至指定目录?

NestJS + TypeScript 实现 Excel 文件上传到指定目录

步骤1:安装依赖

首先安装文件上传所需的核心包:

npm install @nestjs/platform-express multer
npm install -D @types/multer

步骤2:配置文件上传模块

在项目模块(比如AppModule)中导入MulterModule,配置存储目录、文件名规则和文件过滤逻辑,确保只接收.xlsx格式文件:

import { Module } from '@nestjs/common';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname } from 'path';
import { existsSync, mkdirSync } from 'fs';

// 确保存储目录存在,不存在则自动创建
const uploadDir = './uploads';
if (!existsSync(uploadDir)) {
  mkdirSync(uploadDir);
}

@Module({
  imports: [
    MulterModule.register({
      storage: diskStorage({
        destination: uploadDir,
        // 自定义文件名:保留原文件前缀+时间戳+后缀,避免文件覆盖
        filename: (req, file, cb) => {
          const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
          const ext = extname(file.originalname);
          // 严格匹配demo前缀的文件名
          cb(null, `demo-${uniqueSuffix}${ext}`);
        },
      }),
      // 过滤非xlsx文件,同时可额外校验原文件名是否为demo.xlsx
      fileFilter: (req, file, cb) => {
        if (!file.originalname.match(/\.(xlsx)$/) || file.originalname !== 'demo.xlsx') {
          return cb(new Error('仅允许上传名为demo.xlsx的Excel文件'), false);
        }
        cb(null, true);
      },
      // 限制文件大小为10MB
      limits: { fileSize: 10 * 1024 * 1024 },
    }),
  ],
})
export class AppModule {}

步骤3:编写上传控制器

创建控制器接口,处理前端的文件上传请求:

import { Controller, Post, UploadedFile, UseInterceptors, HttpException, HttpStatus } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';

@Controller('upload')
export class UploadController {
  @Post('excel')
  @UseInterceptors(FileInterceptor('file'))
  async uploadExcel(@UploadedFile() file: Express.Multer.File) {
    try {
      // 如需解析Excel内容,可安装xlsx包后添加解析逻辑
      // import * as xlsx from 'xlsx';
      // const workbook = xlsx.readFile(file.path);
      // const sheetData = xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);

      return {
        code: HttpStatus.OK,
        message: '文件上传成功',
        storagePath: file.path,
        originalFileName: file.originalname,
      };
    } catch (error) {
      throw new HttpException(`上传失败:${error.message}`, HttpStatus.BAD_REQUEST);
    }
  }
}

核心注意事项

  • 确保服务器对存储目录有写入权限,避免上传失败
  • 若需解析Excel内容,可额外安装xlsx包:npm install xlsx,并参考代码注释中的解析逻辑
  • 前端请求需以multipart/form-data格式发送,表单字段名需与控制器中FileInterceptor('file')的参数一致

内容的提问来源于stack exchange,提问作者Shubham Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:57:19