在将元数据信息实际存储在mongoDB中之前,我很难将其附加到dfile。我正在使用:
const express = require("express");
const router = express.Router();
//File managing with gridfs
const mongoose = require('mongoose');
const path = require('path');
const crypto = require('crypto');
const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const fs = require('fs');
作为库,然后对于存储引擎:
const conn = mongoose.createConnection(mongoURI);
//TODO : test the api for the files
let gfs;
conn.once('open', () => {
// Init stream
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection('uploads');
});
// Create storage engine
const storage = new GridFsStorage({
url: mongoURI,
gfs:gfs,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads'
};
resolve(fileInfo);
});
});
},
metadata: (req, file, cb) => {
const metadata = {
originalname: file.originalname,
// get this information somehow
restaurantID :req.query.restaurantID,
category : req.query.category
};
cb(null, metadata);
}
});
const upload = multer({ storage: storage });
然后对于post API,我还没有足够的代码来更新另一个mongoDB文档,并引用了有效的文件
router.post('/upload', upload.single("file"), (req, res) => {
//All the code to update
}
我需要的是一种存储在req.query中传递的信息并将其放入gridFS文件集合的元数据中的方法,以便进行一些查询以在将来找到正确的文件,然后将其过时地保存。这是我通过此API上传的每个文件的信息。谢谢你们。
答案 0 :(得分:0)
我正在使用此代码向fs.files集合的元数据中添加一些信息。
state.storage = multerGridfs({
url: mongoServerUrl,
db: db.connection,
file: (req, file) => {
logger.info(`Uploading file: ${file.originalname} for account ${req.params.accountId}`);
return {
filename: file.originalname,
metadata: { accountId: req.params.accountId}
};
},
});
如您所见,使用元数据会将其作为文件:部分中返回的对象的属性来返回。
这里是一些很好的例子https://www.npmjs.com/package/multer-gridfs-storage的链接。
希望这会有所帮助