如何在NestJS中使用Multer统计并限制待上传PDF的页数?
NestJS实现PDF上传页数限制的解决方案
核心思路
要实现PDF页数限制,需要先解析PDF文件获取页数,再和设定的阈值对比。这里使用pdf-parse库解析PDF内容,结合Multer的异步文件过滤器完成校验。
步骤1:安装依赖
先安装PDF解析工具:
npm install pdf-parse
步骤2:修改Multer拦截器配置
调整原有的FilesInterceptor配置,改用内存存储获取文件Buffer,在fileFilter中异步完成页数校验:
import { FilesInterceptor, memoryStorage } from '@nestjs/platform-express'; import * as pdfParse from 'pdf-parse'; // ... 你的控制器代码 @UseInterceptors( FilesInterceptor('files', 10, { storage: memoryStorage(), // 将文件暂存到内存,方便直接读取Buffer limits: { fileSize: 10242880 }, // 保留原有的10MB大小限制 fileFilter: async (req, file, callback) => { // 1. 校验文件类型 const allowedExtensions = /\.(jpg|jpeg|png|pdf)$/; if (!file.originalname.match(allowedExtensions)) { req.fileValidationError = '无效文件类型,支持的类型:jpg、jpeg、png、pdf'; return callback(null, false); } // 2. 文件大小校验(和limits配置形成双重保障) const fileSize = parseInt(req.headers['content-length']); if (fileSize > 10242880) { req.fileValidationError = '文件大小超出限制,最大支持10MB'; return callback(null, false); } // 3. PDF页数校验 if (file.mimetype === 'application/pdf') { try { const pdfInfo = await pdfParse(file.buffer); const maxAllowedPages = 50; // 自定义最大页数限制 if (pdfInfo.numpages > maxAllowedPages) { req.fileValidationError = `PDF页数超出限制,最多允许${maxAllowedPages}页`; return callback(null, false); } } catch (err) { req.fileValidationError = 'PDF文件解析失败,可能文件损坏'; return callback(null, false); } } // 所有校验通过,允许上传 callback(null, true); }, }) )
关键注意点
- 存储方式选择:
memoryStorage()能直接获取文件Buffer,减少磁盘IO开销;如果担心大文件内存占用,可改用磁盘存储,此时需读取file.path路径的文件进行解析(注意异步处理文件读取)。 - 校验逻辑顺序:先做快速校验(类型、大小),再做耗时的PDF解析,提升整体性能。
- 异常处理:必须捕获PDF解析的异常,避免因损坏文件导致服务报错。
- 文件类型判断:优先用
file.mimetype === 'application/pdf'识别PDF,比后缀名更可靠,防止文件后缀篡改。
内容的提问来源于stack exchange,提问作者P Purcinelli
相关产品推荐
相关产品推荐

