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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:25:36