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