【问题标题】:How to make express download link with GridFsBucket?如何使用 GridFsBucket 制作快速下载链接?
【发布时间】:2021-11-16 19:22:22
【问题描述】:

正如标题所说,如何使用 express 与来自 mongoDB(GridFsBucket) 的文件建立直接下载链接?

该文件应该可以从内存中下载,因为我不想将它临时保存在服务器上。

我有这个方法:

async function downloadFileFromDB(fileId) {
  var gridfsbucket = new mongoose.mongo.GridFSBucket(mongoose.connection.db, {
    chunkSizeBytes: 1024,
    bucketName: 'filesBucket'
  });
  try {
    const stream = gridfsbucket.openDownloadStream(fileId)
    const fileBuffer = Buffer.from(stream)
    return fileBuffer
  } catch (err) {
    stream.on('error', () => {
      console.log("Some error occurred in download:" + error);
    })
    console.log(err);
  } 
}

还有这条路线:

router.get('/download-file', async (req,res) => {
    const fileId = req.query.fileId
    const ObjectFileId = new ObjectId(fileId)
    const fileBuffer = await fileFacade.downloadFileFromDB(ObjectFileId)
    res.download(fileBuffer)
})

但是 res.download 需要的是路径而不是缓冲区。同样,我不确定我是否可以直接从 openDownloadStream 方法制作缓冲区。

谁能帮忙?

【问题讨论】:

    标签: node.js mongodb express gridfs


    【解决方案1】:

    我相信您需要将数据写入您的res 对象。我是这样完成的:

    const readStream = gridfs.openDownloadStreamByName(filename);
    readStream.on("data", (chunk) => {
      res.write(chunk);
    });
    readStream.on("end", () => {
      res.status(200).end();
      mongoClient.close();
    });
    readStream.on("error", (err) => {
      console.log(err);
      res.status(500).send(err);
    });
    

    所以,你可能只需要这样做:

    res.write(fileBuffer).end();
    //// Instead of doing:
    // res.download(fileBuffer);
    

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2016-07-26
      • 2011-04-11
      • 1970-01-01
      • 2015-09-29
      • 2019-01-17
      • 1970-01-01
      • 2015-03-28
      • 2021-08-27
      相关资源
      最近更新 更多