使用Node.js / Express和Mongoose将图像存储在MongoDB中

目前我使用angular-file-upload来处理图片上传,而我只是将图片保存到服务器的文件系统,并在HTML中引用它。 但是,我想尝试将图像直接存储在为我的博客文章定义的架构中的数据库中。

var blogSchema = new Schema({ title: String, author: String, body: String, likes: { type: Number, default: 0 }, comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }], date: { type: Date, default: Date.now }, imageURL: String // instead of this image: // store it directly }); "imageURL: String" stores the path to the image. 

我想使它成为可以存储图像本身的字段。 我在想,我可能只是像我已经做的那样上传图像,而是在上传完成后转换图像,并在Mongo中以二进制(或其他forms)存储。 这可能吗?

谢谢!

下面的这个例子展示了如何使用mongoose把图片上传到MongoDB。 点击这个链接的原始来源

 var express = require('express'); var fs = require('fs'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var imgPath = '/path/yourimage.png'; mongoose.connect('localhost', 'testing_storeImg'); var schema = new Schema({ img: { data: Buffer, contentType: String } }); var A = mongoose.model('A', schema); mongoose.connection.on('open', function () { console.error('mongo is open'); A.remove(function (err) { if (err) throw err; console.error('removed old docs'); // store an img in binary in mongo var a = new A; a.img.data = fs.readFileSync(imgPath); a.img.contentType = 'image/png'; a.save(function (err, a) { if (err) throw err; console.error('saved img to mongo'); // start a demo server var server = express.createServer(); server.get('/', function (req, res, next) { A.findById(a, function (err, doc) { if (err) return next(err); res.contentType(doc.img.contentType); res.send(doc.img.data); }); }); server.on('close', function () { console.error('dropping db'); mongoose.connection.db.dropDatabase(function () { console.error('closing db connection'); mongoose.connection.close(); }); }); server.listen(3333, function (err) { var address = server.address(); console.error('server listening on http://%s:%d', address.address, address.port); console.error('press CTRL+C to exit'); }); process.on('SIGINT', function () { server.close(); }); }); }); }); 
 <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="myimage"/> <input type="text" name="owner" placeholder="imageOwner"/> <input type="text" name="description" placeholder="imageDescription"/> <input type="submit" name="submit" value="submit"> </form> 
 router.get("/show/:i", function (req, res) { var dataGet = {_id: req.params.i} fileModel.findOne(dataGet).exec(function (err, doc) { if (err) { return next(err) } var base64dataa = new Buffer(doc.fileData, 'binary').toString('base64'); var ress = { fileData: base64dataa, mime: doc.mimeType, name: doc.fileName } // res.json(ress) res.contentType('image/jpeg') res.send(doc.fileData) }) }); router.post('/display/', function (req, res) { var data = { file: req.body.fileData, mime: req.body.mime, name: req.body.name } res.json(data) }) 

这是将数据保存到mongodb的代码。 data是二进制的。 我可以显示这个'image / jpg,base64,{{data}}',但我不明白我怎么能显示base64data

 file.on('data', function (data) { buffer += data; var file = new fileModel({ fileData: data })