我有以下代码:
router.use('/', function (req, res, next) {
var token = req.headers['authorization'];
jwt.verify(token, config.secret, function (err, decoded) {
if (err) {
return res.json({
success: false,
message: 'Failed to authenticate',
error: err
});
} else {
req.decoded = decoded;
}
next();
});
})
var _storage = multer.diskStorage({
destination: function (req, file, cb) {
var dest = './express-server/uploads/users/' + req.decoded.user._id;
var stat = null;
try {
stat = fs.statSync(dest);
}
catch (err) {
fs.mkdirSync(dest);
}
if (stat && !stat.isDirectory()) {
throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
}
cb(null, dest )
},
filename: function (req, file, cb) {
crypto.pseudoRandomBytes(2, function (err, raw) {
cb(null, raw.toString('hex') + '.' + file.originalname.toLowerCase());
});
}
});
var upload = multer({storage: _storage});
imageType = upload.single('fileUpload');
router.post('/upload', imageType, function (req, res, next) {
console.log(req.file.path) // this logs out the path
res.send({success:true);
});
到目前为止,图像从前端上传并正确存储在文件系统中。
在这条路线下方,我有另一条路线:
router.post('/new', function ( req, res, next) {
var token = req.headers['authorization'];
var decoded = jwt.decode(token);
User.findById(decoded.user._id, function (err, doc) {
if (err) {
return res.status(404).json({
title: 'An error occured',
err: err
});
}
var person = new Person({
name: req.body.name,
lastName: req.body.lastName,
imageURL: **// how i can grab the uploaded file path inside this route from the upload route? Is this even possible?**,
user: doc
})
在此代码之后我将表单保存在Mongodb中没有任何问题,我只是无法获取文件名路径。
Person.save(function (err, newPerson) {
if (err) {
return res.status(404).json({
title: 'An error occured',
err: err
});
}
doc.person.push(newPerson);
doc.save();
res.status(200).json({
message: 'Person Saved!',
obj: newPerson
});
});
});
});
有什么想法吗?
答案 0 :(得分:0)
如果您的中间件或路由处理程序中有一个正常运行的映像保存步骤,最好的办法是将该上载文件的公共URL添加到用户对象以便以后保存。
我强烈反对建议将整个图像作为缓冲区存储在数据库中的方法。尽管可以做到这一点,但它会给您的服务器带来比从磁盘发送静态文件更多的负担,并且有静态文件处理(例如CDN)的低成本选项,您不会如果存储在数据库中,则可以使用。
答案 1 :(得分:-1)
无法获取使用当前设置上传的文件。
我会做什么,如果我是你,也是要保存用户在数据库中的上传。
router.post('/upload', imageType, function (req, res, next) {
User.findById(req.decoded.user._id, function (err, doc) {
if (err) { return res.status(500).send("Internal server error") }
doc.file = req.file;
doc.save( function( err ) { res.send( { success: true } ) }
} );
});
然后在你的路线
router.post('/new', function ( req, res, next) {
var token = req.headers['authorization'];
var decoded = jwt.decode(token);
User.findById(decoded.user._id, function (err, doc) {
if (err) {
return res.status(404).json({
title: 'An error occured',
err: err
});
}
var person = new Person({
name: req.body.name,
lastName: req.body.lastName,
imageURL: doc.file.path
user: doc
});
} );