如何从multer-gridfs-storage按metadata查询的files对象提取filename下载文件
解决方案
你调用gfs.find()查询返回的files是GridFS文件文档组成的数组,每个文档本身就包含filename字段,直接取值即可替换原来的req.params.filename。
步骤1:修正代码笔误
你现有代码里有拼写错误:files.legnth 应为 files.length。
步骤2:提取filename
分两种场景处理:
- 单个用户仅对应1个PDF文件:直接取数组第一个元素的filename字段
- 单个用户对应多个PDF文件:可根据需求指定数组索引,或先返回文件列表供用户选择后再下载对应文件
修改后的完整代码段
router.get("/pdf/:UserId", (req, res) => { gfs .find({ metadata: { UserID: req.params.UserId } }) .toArray((err, files) => { // 先处理查询错误 if (err) { return res.status(500).json({ err: "查询文件失败" }); } // 检查文件是否存在 if (!files || files.length === 0) { return res.status(404).json({ err: "No file exists", }); } console.log({ files }); // 提取第一个匹配文件的filename,多文件场景可自行调整索引 const targetFilename = files[0].filename; // 替换为提取到的文件名,同时设置正确的响应头方便浏览器识别PDF res.set('Content-Type', 'application/pdf'); const readstream = gfs .openDownloadStreamByName(targetFilename) .pipe(res); // 可选:添加流错误处理 readstream.on('error', (streamErr) => { res.status(500).json({err: "文件读取失败"}); }); }); });
额外注意事项
如果你上传时指定了bucketName: "uploads",初始化gfs实例时需要对应配置相同的bucket名称,否则会出现找不到文件的问题。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

