如何使用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
相关产品推荐
相关产品推荐

