我正在建立一个博客网站,除image upload
上的以外,其他所有程序都工作正常Post
。该post
工程100%,但是当我附上image
它不会uploaded or created
,我不知道我做错了,请我需要帮助。我node
和express
几个月前开始学习。请帮我。
在index.js文件中
var multer = require('multer');
var upload = multer({dest: './uploads'});
const Schema = mongoose.Schema;
const ObjectId = Schema.ObjectId;
我的架构
const BlogPost = new Schema({
author: ObjectId,
title: String,
body: String,
profileimage: String,
date: { type: Date, default: Date.now },
comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
});
var Post = mongoose.model('Post', BlogPost);
router.post("/makepost", upload.single('profileimage'), (req, res) => {
var myData = new Post(req.body);
if(req.file) {
console.log('Uploading File....');
var profileimage = req.file.filename;
console.log(profileimage)
}else {
console.log('No File Uploaded....');
var profileimage = 'noimage.jpg';
}
myData.save()
.then(item => {
res.redirect('/posts');
})
.catch(err => {
res.status(400).send("unable to save to database");
});
});
这是我的看法
<form action='/makepost' method='post' enctype="multipart/form-data">
<p>Title: <input type='text' name='title' </p>
<p>Content: <input type='text' name='body' </p>
<div class="form-group"> <label>Profile Image</label><input class="form-control"
name="profileimage" type="file" />
<p><input type='submit' value='post'></p>
由于您将multer与磁盘存储一起使用,因此您需要先从临时位置读取图像,然后再将其与猫鼬一起存储。此外,我会将猫鼬模式中的图片数据类型更改为buffer
。
这样的事情应该可以工作(请注意,我使用的是async / await而不是promise):
router.post("/makepost", upload.single('profileimage'), async (req, res) => {
const newPost = new Post(req.body);
if (req.file) {
const imgBuffer = await fs.promises.readFile(req.file.path); // TODO add error handling
newPost.profileimage = imgBuffer;
}
try {
await myData.save();
res.redirect('/posts');
}catch(err) {
res.status(400).send("unable to save to database");
}
});
// mongoose schema
...
profileimage: Buffer,
...
您还可以将图像存储为Base64编码的字符串,并将数据类型保留string
在架构中。
编辑:
如评论中所述-将profileimage的数据类型改回string
为profileimage将仅包含文件的路径。
router.post("/makepost", upload.single('profileimage'), async (req, res) => {
const newPost = new Post(req.body);
if (req.file) {
newPost.profileimage = req.file.path;
}
...
添加一个快速中间件来提供图像,例如
app.use(express.static('./uploads'));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句