繁体   English   中英

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

[英]Store an image in MongoDB using Node.js/Express and Mongoose

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

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中。 这可能吗?

谢谢!

下面的示例显示了如何使用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();
      });
    });
  });

});

 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 }) 

 var Busboy = require('busboy'); router.post('/upload', function (req, res) { var busboy = new Busboy({headers: req.headers}); var base64data = ""; var filetype = ""; var name = ""; var argum = []; var data2 busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { var buffer = ""; filetype = mimetype; name = filename; // file.setEncoding('base64'); file.on('data', function (data) { buffer += data; var file = new fileModel({ fileData: data }) // file.save(function (err, file) { if (err) { return next(err) } // res.json(201, newData) // console.log("Save in database" + file.desc) }) }); file.on('end', function () { base64data = buffer; }); }); busboy.on('field', function (fieldname, val, fieldnameTruncated, valTruncated) { argum.push(val); }); busboy.on('finish', function () { var base64dataa = new Buffer(base64data, 'binary').toString('base64'); res.json(base64dataa) var jsonBin = { base64data_: base64data, mime_: filetype, name_: name, owner_: argum[0], description_: argum[1] } // res.json(jsonBin) var file = new fileModel({ fileData: jsonBin.base64data, mimeType: jsonBin.mime_, fileName: jsonBin.name_, fileOwner: jsonBin.owner_, desc: jsonBin.description_ }) // file.save(function (err, file) { if (err) { return next(err) } // res.json(201, newData) console.log("Save in database" + file.desc) }) }); req.pipe(busboy); }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM