我正在尝试寻找一种将文件直接从前端上传到 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 中?
不幸的是,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 包。