multer-gridFS-storage还能用吗?

问题描述 投票:0回答:1

我正在尝试寻找一种将文件直接从前端上传到 mongodb 的 gridFS 的方法。在我遇到的所有教程中,人们都使用 multer-gridFS 直接上传到数据库。然而,它们都是相当老的教程,当我在 npm 上查看 Multer-gridFS 的 readme.md 时,它说它与 mongodb 版本 2 和 3 兼容。这是否意味着这个包已被弃用并且不再有用?他们提供的代码似乎也不适合我。我还没有找到更好的方法将文件上传到数据库,因为mongodb官方文档推荐使用这个代码片段进行上传:

fs.createReadStream('./myFile').
     pipe(bucket.openUploadStream('myFile', {
         chunkSizeBytes: 1048576,
         metadata: { field: 'myField', value: 'myValue' }
     })

这意味着我需要 myFile 的路径,但是当用户上传文件时,我们显然无法访问绝对路径。我想知道是否有人知道一种将文件上传到 gridfs 的方法,而不必先将文件下载到预定文件夹并使用该文件夹的路径存储到 gridFS 中?

node.js mongodb mern gridfs multer-gridfs-storage
1个回答
0
投票

不幸的是,multer-gridfs-storage 似乎已被放弃。 (自 mongo 3.x 以来,它一直抛出来自 mongo 驱动程序的弃用警告,所以我怀疑它是否适用于 mongo 7.x)如果您仍然想使用 multer,但直接上传到 mongodb.GridFSBucket 而不使用 multer- gridfs-storage,您可以执行以下操作

routes.js

   app.post("/bslite/document/upload", ctlr.upload.bind(ctlr)); 

mycontroller.js

const mongo = require("mongodb").MongoClient;
const { GridFSBucket } = require("mongodb");
const multer = require("multer");

class DocumentController extends BasicController {
  #client;
  #db;
  #bucket;
  #upload;

  /**
   * Constructor
   */
  constructor() {
    super(collectionNames.DOCUMENTS, DOCUMENT);  ///
    var mongoConf = getConfigData(MONGO_CONFIG);  // replace with your own configuration or hardcode the database below

    (async () => {
      this.#client = await mongo.connect(getConnectionUrl(), getConnectionOptions());  // genConnectionUrl() and getConnectionOptions() are my own functions - substitute your values
      this.#db = this.#client.db(mongoConf.database);
      this.#bucket = new GridFSBucket(this.#db, { bucketName: "doc" });
    })();

    this.#upload = multer();
  }

   ...

  async upload(req, res) {
    this.#upload.single("file")(req, res, () => {
      const { body, user } = req;
      const {
       x, y, z
      } = body;
      
      // business logic, if any, goes here

      // example metadata - not required
      const metadata = {
        encrypted: false,
        mimeType: req.file.mimetype,
        x: x,
        y: y,
        z: z,
        createdDate: new Date(),
        lastModifiedDate: new Date(),
        modifiedByUsers: [user._id],
        description: description || "",
        createdBy: user && user._id ? new ObjectID(user._id) : null,
      };

      var buffer = req.file.buffer;
      var stream = this.#bucket.openUploadStream(req.file.originalname, {metadata: metadata, contentType: req.file.mimetype});
      stream.write(buffer);
      stream.on("finish", (file) => {
        logger.debug("Received Request to upload document " + req.file.originalname + " from user " + req.user.sid);
        res.json({ document: file.filename });
      });
    
      stream.end();
    });
  }

   ...
}

如果您实现了类似上述的操作,您应该能够安全地删除 multer-gridfs-storage 包。

© www.soinside.com 2019 - 2024. All rights reserved.