Stocker des images dans une base de données MongoDB

174

Comment puis-je stocker des images dans une base de données MongoDB plutôt que du texte? Puis-je créer un tableau d'images dans une base de données MongoDB? Sera-t-il possible de faire de même pour les vidéos?

Chani
la source
1
La réponse courte est: Oui, vous pouvez stocker de (petites) images si vous les encodez correctement avec base64, voir stackoverflow.com/questions/11442356 J'ai également trouvé menge.io/2015/03/24/storing-small-images-in- mongodb un très bon point de départ.
B - rian

Réponses:

108

Veuillez consulter la documentation GridFS pour plus de détails sur le stockage de ces données binaires.

La prise en charge de votre langue spécifique doit être liée au bas de l'écran.

Vice-président Gates
la source
40
GridFS est destiné aux documents> 16 Mo. Toutes les données binaires ne sont pas aussi volumineuses. En plus de pouvoir dépasser cette limite, y a-t-il d'autres avantages à utiliser GridFS au lieu du type BinData?
Brandon Fitzpatrick
3
Les vidéos auront tendance à être> 16 Mo, donc cette réponse est probablement raisonnable. Devrait peut-être le mentionner cependant.
Chanoch
1
une autre solution, plutôt que d'utiliser GridFS?
Abhishek Mani
1
@AbhishekMani, l'autre solution est de ne pas du tout les stocker dans MongoDB. Maintenant, en 2018, il est infiniment plus facile d'écrire ces données dans quelque chose comme le stockage S3 d'Amazon ou Azure BLOB.
Gates VP
Je pense à ce que dit la MongoDB
xinbenlv
64

"Vous devez toujours utiliser GridFS pour stocker des fichiers de plus de 16 Mo" - Quand dois-je utiliser GridFS?

Les documents MongoDB BSON sont limités à 16 Mo. Donc, si la taille totale de votre tableau de fichiers est inférieure à cela, vous pouvez les stocker directement dans votre document en utilisant le type de données BinData .

Vidéos, images, PDF, feuilles de calcul, etc. - peu importe, ils sont tous traités de la même manière. C'est à votre application de renvoyer un en-tête de type de contenu approprié pour les afficher.

Consultez la documentation GridFS pour plus de détails.

Mike Causer
la source
24

Vous pouvez essayer celui-ci:

String newFileName = "my-image";
File imageFile = new File("/users/victor/images/image.png");
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
gfsFile.save();
Victoriza
la source
13

http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb

Il existe un plugin Mongoose disponible sur NPM appelé mongoose-file. Il vous permet d'ajouter un champ de fichier à un schéma Mongoose pour le téléchargement de fichiers. Je ne l'ai jamais utilisé mais cela pourrait s'avérer utile. Si les images sont très petites, vous pouvez les encoder en Base64 et enregistrer la chaîne dans la base de données.

Stockage de petits fichiers (moins de 1 Mo) avec MongoDB dans NodeJS SANS GridFS

Mick Cullen
la source
8

Vous pouvez utiliser le type de données bin si vous utilisez un langage de script pour stocker des fichiers / images dans MongoDB. Les données Bin sont développées pour stocker des fichiers de petite taille.

Reportez-vous à votre pilote de langage de script. Pour PHP, cliquez ici .

Tharindu
la source
6

installer ci-dessous les bibliothèques

var express = require(‘express’);
var fs = require(‘fs’);
var mongoose = require(‘mongoose’);
var Schema = mongoose.Schema;
var multer = require('multer');

connectez votre mongo db:

mongoose.connect(‘url_here’);

Définir le schéma de la base de données

var Item = new ItemSchema(
  { img: 
  { data: Buffer, contentType: String }
 }
);
var Item = mongoose.model('Clothes',ItemSchema);

en utilisant le middleware Multer pour télécharger la photo côté serveur.

app.use(multer({ dest: ‘./uploads/’,
rename: function (fieldname, filename) {
return filename;
},
}));

post req à notre base de données

app.post(‘/api/photo’,function(req,res){
var newItem = new Item();
newItem.img.data = fs.readFileSync(req.files.userPhoto.path)
newItem.img.contentType = image/png’;
newItem.save();
});
Samkit Shah
la source
Monsieur et si je veux ajouter un tableau d'images
Nikhil Patil
3
var upload = multer({dest: "./uploads"});
var mongo = require('mongodb');
var Grid = require("gridfs-stream");
Grid.mongo = mongo;

router.post('/:id', upload.array('photos', 200), function(req, res, next){
gfs = Grid(db);
var ss = req.files;
   for(var j=0; j<ss.length; j++){
     var originalName = ss[j].originalname;
     var filename = ss[j].filename;
     var writestream = gfs.createWriteStream({
         filename: originalName
     });
    fs.createReadStream("./uploads/" + filename).pipe(writestream);
   }
});

À votre avis:

<form action="/" method="post" enctype="multipart/form-data">
<input type="file" name="photos">

Avec ce code, vous pouvez ajouter des images uniques ou multiples dans MongoDB.

AshvinG
la source
0

Cela a fonctionné pour moi,

  1. Allez dans ce répertoire dans CMD: - C: \ Program Files \ MongoDB \ Server \ 4.0 \ bin
  2. exécutez la commande suivante: - mongofiles met image.jpg
  3. pour certains fichiers que nous utilisons: - db.fs.files.find.pretty ()
harikesh jaiswal
la source