Almacenar imágenes en una base de datos MongoDB

174

¿Cómo puedo almacenar imágenes en una base de datos MongoDB en lugar de solo texto? ¿Puedo crear una matriz de imágenes en una base de datos MongoDB? ¿Será posible hacer lo mismo para los videos?

Chani
fuente
1
La respuesta corta es: Sí, puede almacenar imágenes (pequeñas) si las codifica correctamente base64, consulte stackoverflow.com/questions/11442356 También encontré menge.io/2015/03/24/storing-small-images-in- mongodb un muy buen punto de partida.
B - rian

Respuestas:

108

Consulte los documentos de GridFS para obtener detalles sobre el almacenamiento de dichos datos binarios.

El soporte para su idioma específico debe estar vinculado en la parte inferior de la pantalla.

Vicepresidente de Gates
fuente
40
GridFS es para documentos> 16 MB. No todos los datos binarios son tan grandes. Además de poder superar ese límite, ¿hay otros beneficios al usar GridFS en lugar de solo el tipo BinData?
Brandon Fitzpatrick
3
Los videos tenderán a ser> 16 MB, por lo que esta respuesta probablemente sea razonable. Quizás debería mencionar esto sin embargo.
Chanoch
1
alguna otra solución, en lugar de usar GridFS?
Abhishek Mani
1
@AbhishekMani la otra solución es no almacenarlos en MongoDB en absoluto. Ahora, en 2018, es infinitamente más fácil escribir estos datos en algo como el almacenamiento S3 de Amazon o Azure BLOB.
Gates VP
Creo lo que dice el MongoDB
xinbenlv
64

"Siempre debe usar GridFS para almacenar archivos de más de 16 MB" - ¿ Cuándo debo usar GridFS?

Los documentos MongoDB BSON tienen un límite de 16 MB. Entonces, si el tamaño total de su matriz de archivos es menor que eso, puede almacenarlos directamente en su documento utilizando el tipo de datos BinData .

Videos, imágenes, PDF, hojas de cálculo, etc., no importa, todos reciben el mismo trato. Depende de su aplicación devolver un encabezado de tipo de contenido apropiado para mostrarlos.

Consulte la documentación de GridFS para obtener más detalles.

Mike Causer
fuente
24

Puedes probar este:

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

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

Hay un complemento Mongoose disponible en NPM llamado mongoose-file. Le permite agregar un campo de archivo a un esquema de mangosta para cargar archivos. Nunca lo he usado, pero podría resultar útil. Si las imágenes son muy pequeñas, podría codificarlas en Base64 y guardar la cadena en la base de datos.

Almacenar algunos archivos pequeños (de menos de 1 MB) con MongoDB en NodeJS SIN GridFS

Mick Cullen
fuente
8

Puede usar el tipo de datos bin si está utilizando algún lenguaje de script para almacenar archivos / imágenes en MongoDB. Los datos bin se desarrollan para almacenar archivos de pequeño tamaño.

Consulte su controlador de lenguaje de scripting. Para PHP, haga clic aquí .

Tharindu
fuente
6

instalar debajo de las bibliotecas

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

conecta tu mongo db:

mongoose.connect(‘url_here’);

Definir esquema de base de datos

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

usando el middleware Multer para cargar la foto en el lado del servidor.

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

post req a nuestro db

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
fuente
Señor, ¿qué pasa si quiero agregar una variedad de imágenes
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);
   }
});

En tu opinión:

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

Con este código, puede agregar imágenes individuales y múltiples en MongoDB.

AshvinG
fuente
0

Esto funcionó para mí

  1. Vaya a este directorio en CMD: - C: \ Archivos de programa \ MongoDB \ Server \ 4.0 \ bin
  2. ejecuta el siguiente comando: - mongofiles pone image.jpg
  3. para los archivos seleccionados que usamos: - db.fs.files.find.pretty ()
harikesh jaiswal
fuente