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
相关产品推荐
相关产品推荐

