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

Node.js实现接收PDF并打印的API端点遇文件上传问题求助

解决Express接收PDF文件上传并完成打印流程的方案

1. 先安装必要依赖

Express本身不支持文件上传处理,需要用multer处理表单文件,搭配pdf-to-printer实现打印:

npm install multer pdf-to-printer

2. 后端完整代码(修复文件上传逻辑)

以下代码包含文件上传配置、临时存储、打印、自动清理全流程,同时处理错误场景:

const express = require('express');
const multer = require('multer');
const printer = require('pdf-to-printer');
const fs = require('fs').promises;
const path = require('path');

const app = express();
const PORT = 3000;

// 配置multer的临时存储规则
const storage = multer.diskStorage({
  destination: async (req, file, cb) => {
    // 确保临时目录存在,不存在则自动创建
    const tempDir = path.join(__dirname, 'temp');
    try {
      await fs.access(tempDir);
    } catch {
      await fs.mkdir(tempDir);
    }
    cb(null, tempDir);
  },
  filename: (req, file, cb) => {
    // 用时间戳+原文件名避免重复
    cb(null, `${Date.now()}-${file.originalname}`);
  }
});

// 过滤仅允许PDF文件上传
const fileFilter = (req, file, cb) => {
  if (file.mimetype === 'application/pdf') {
    cb(null, true);
  } else {
    cb(new Error('仅支持上传PDF格式文件'), false);
  }
};

const upload = multer({ storage, fileFilter });

// 核心API端点:接收PDF、打印、清理
app.post('/print-pdf', upload.single('pdfFile'), async (req, res) => {
  let tempFilePath = null;
  try {
    if (!req.file) {
      return res.status(400).send('未检测到上传的PDF文件');
    }

    tempFilePath = req.file.path;
    // 执行打印操作
    await printer.print(tempFilePath);
    // 打印完成后删除临时文件
    await fs.unlink(tempFilePath);

    res.status(200).send('PDF已成功打印,临时文件已清理');
  } catch (error) {
    // 无论成功与否,都要尝试清理临时文件,避免残留
    if (tempFilePath) {
      try {
        await fs.unlink(tempFilePath);
      } catch (cleanupErr) {
        console.error('清理临时文件失败:', cleanupErr);
      }
    }
    console.error('处理流程出错:', error);
    res.status(500).send(`处理失败:${error.message}`);
  }
});

app.listen(PORT, () => {
  console.log(`服务运行在 http://localhost:${PORT}`);
});

3. HTML表单修正要点

必须确保表单的enctype设置为multipart/form-data,且文件输入框的name属性与后端upload.single('pdfFile')中的名称一致:

<!DOCTYPE html>
<html>
<head>
  <title>PDF打印上传</title>
</head>
<body>
  <form action="http://localhost:3000/print-pdf" method="POST" enctype="multipart/form-data">
    <input type="file" name="pdfFile" accept=".pdf" required>
    <button type="submit">上传并打印</button>
  </form>
</body>
</html>

关键注意事项

  • 跨域问题:如果前端和后端不在同一域名,需安装cors中间件并启用(npm install cors,添加app.use(cors()))。
  • 权限问题:确保Node进程有临时目录的读写权限,以及打印机的访问权限。
  • 异常处理:打印失败时仍会自动清理临时文件,避免磁盘空间浪费。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:05