如何在Node.js中不使用Express将已生成的PDF文件上传至GridFS
如何在Node.js中不使用Express将已生成的PDF文件上传至GridFS
没问题!其实直接在Node.js后端把本地已生成的PDF文件存入GridFS很简单,完全不需要依赖Express的上传接口。下面我给你两种常用的实现方式,都是纯后端直接操作的:
方法一:使用mongoose-gridfs库(基于Mongoose)
如果你项目里已经在用Mongoose,这个方法会很顺手:
- 先安装依赖:
npm install mongoose mongoose-gridfs
- 编写上传代码:
const mongoose = require('mongoose'); const { createModel } = require('mongoose-gridfs'); const fs = require('fs'); // 第一步:连接你的MongoDB数据库 mongoose.connect('mongodb://localhost:27017/your-database-name', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('数据库连接成功')) .catch(err => console.error('数据库连接失败:', err)); // 第二步:创建GridFS的存储模型,指定存储PDF的集合名 const PDFStorage = createModel({ modelName: 'PDFDocument', collection: 'pdf_files' }); // 第三步:读取本地已生成的PDF,写入GridFS const localPDFPath = './path/to/your/generated-file.pdf'; // 替换成你的PDF实际路径 fs.createReadStream(localPDFPath) .pipe(PDFStorage.write({ filename: 'user-invoice-2024.pdf', // 存入GridFS时的文件名 contentType: 'application/pdf', // 必须指定PDF的MIME类型 // 还可以加自定义元数据,比如:metadata: { userId: '123', invoiceId: 'INV-001' } })) .on('finish', (savedFile) => { console.log('PDF已成功存入GridFS!文件ID:', savedFile._id); // 这里可以把savedFile._id存到其他业务集合里,方便后续查询 }) .on('error', (err) => { console.error('上传失败:', err); });
这个方法的核心是直接用Node.js的文件流(fs.createReadStream)把本地PDF文件直接 pipe 到GridFS的写入流,全程不需要Express参与。
方法二:使用原生MongoDB驱动
如果不想依赖Mongoose,用官方的原生驱动也能轻松实现:
- 安装依赖:
npm install mongodb
- 编写上传代码:
const { MongoClient, GridFSBucket } = require('mongodb'); const fs = require('fs'); async function uploadPDFToGridFS() { const dbUri = 'mongodb://localhost:27017/your-database-name'; const client = new MongoClient(dbUri); try { // 连接数据库 await client.connect(); const database = client.db(); // 创建GridFS桶(相当于专门存储文件的容器) const pdfBucket = new GridFSBucket(database, { bucketName: 'pdf_files' // 自定义桶名,方便管理 }); // 打开上传流,指定存储的文件名和类型 const uploadStream = pdfBucket.openUploadStream('report-2024.pdf', { contentType: 'application/pdf', // 同样可以加元数据:metadata: { reportType: 'monthly', department: 'finance' } }); // 读取本地PDF文件,通过流上传到GridFS fs.createReadStream('./path/to/your/generated-report.pdf') .pipe(uploadStream) .on('finish', () => { console.log('PDF上传完成!文件ID:', uploadStream.id); }) .on('error', (err) => { console.error('上传出错:', err); }); } finally { // 操作完成后关闭数据库连接(如果不需要长期保持连接的话) await client.close(); } } // 调用函数执行上传 uploadPDFToGridFS();
这个方式更贴近MongoDB的底层API,逻辑和第一种类似:通过文件流直接把本地生成的PDF写入GridFS,完全绕开了Express的上传流程。
小提示
- 确保本地PDF文件的路径正确,避免出现文件找不到的错误
- 可以根据业务需求给文件添加元数据,方便后续查询和管理
- 上传完成后,记得把文件的
_id(或id)记录到你的业务数据中,方便后续从GridFS里读取文件
备注:内容来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

