web-dev-qa-db-fra.com

Stocker une image dans MongoDB en utilisant Node.js/Express et Mongoose

Actuellement, je gère les téléchargements d’images à l’aide de fichiers angulaires et je sauvegarde simplement l’image dans le système de fichiers du serveur et la référence dans le code HTML. Cependant, je souhaite essayer de stocker l'image directement dans la base de données dans le schéma que j'ai défini pour mes articles de blog.

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.

Je veux faire en sorte que je puisse juste avoir un champ qui stocke l'image elle-même. Je pensais que je pourrais peut-être simplement télécharger l'image comme je le fais déjà, mais la convertir à la place après l'avoir téléchargée et la stocker sous forme binaire (ou sous une autre forme) en Mongo. Est-ce possible?

Merci! 

6
Bryan Cho

Cet exemple ci-dessous montre comment télécharger une image sur MongoDB à l'aide de mangouste. Cliquez sur ce lien pour la source originale

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

});
10
Jaco

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

1
Krzysztof Sikora

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

0
Krzysztof Sikora

C'est un code qui sauvegarde des données dans mongodb. data est binaire. Je peux afficher ceci 'image/jpg, base64, {{data}}' Mais je ne comprends pas comment afficher 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);
});

0
Krzysztof Sikora