Armazenar imagens em um banco de dados MongoDB

174

Como posso armazenar imagens em um banco de dados MongoDB em vez de apenas texto? Posso criar uma matriz de imagens em um banco de dados MongoDB? Será possível fazer o mesmo para vídeos?

Chani
fonte
1
A resposta curta é: Sim, você pode armazenar (pequenas) imagens se codificá-las corretamente com base64, consulte stackoverflow.com/questions/11442356 Também encontrei menge.io/2015/03/24/storing-small-images-in- mongodb é um excelente ponto de partida.
precisa saber é o seguinte

Respostas:

108

Consulte os documentos do GridFS para obter detalhes sobre como armazenar esses dados binários.

O suporte para o seu idioma específico deve estar vinculado na parte inferior da tela.

Gates VP
fonte
40
O GridFS é para documentos> 16 MB. Nem todos os dados binários são tão grandes. Além de ser capaz de superar esse limite, existem outros benefícios em usar o GridFS em vez de apenas o tipo BinData?
precisa saber é o seguinte
3
Os vídeos tendem a ter mais de 16 MB; portanto, essa resposta provavelmente é razoável. Talvez deva mencionar isso embora.
Chanoch
1
qualquer outra solução, em vez de usar o GridFS?
Abhishek Mani 29/10
1
@AbhishekMani a outra solução é não armazená-los no MongoDB. Agora, em 2018, é infinitamente mais fácil gravar esses dados em algo como o armazenamento S3 ou Azure BLOB da Amazon.
Gates VP
Eu acho que o que o MongoDB diz #
231 xinbenlv
64

"Você sempre deve usar o GridFS para armazenar arquivos maiores que 16 MB" - Quando devo usar o GridFS?

Os documentos do MongoDB BSON são limitados a 16 MB. Portanto, se o tamanho total da sua matriz de arquivos for menor que isso, você poderá armazená-los diretamente no seu documento usando o tipo de dados BinData .

Vídeos, imagens, PDFs, planilhas etc. - não importa, todos são tratados da mesma forma. Cabe ao seu aplicativo retornar um cabeçalho de tipo de conteúdo apropriado para exibi-los.

Confira a documentação do GridFS para mais detalhes.

Mike Causer
fonte
24

Você pode tentar 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
fonte
13

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

Existe um plug-in do Mongoose disponível no NPM chamado mongoose-file. Permite adicionar um campo de arquivo a um esquema do Mongoose para upload de arquivos. Eu nunca o usei, mas pode ser útil. Se as imagens forem muito pequenas, você poderá codificá-las pelo Base64 e salvar a sequência no banco de dados.

Armazenando alguns arquivos pequenos (abaixo de 1 MB) com o MongoDB no NodeJS SEM GridFS

Mick Cullen
fonte
8

Você pode usar o tipo de dados bin se estiver usando alguma linguagem de script para armazenar arquivos / imagens no MongoDB. Os dados do compartimento são desenvolvidos para armazenar um tamanho pequeno de arquivos.

Consulte o driver da linguagem de script. Para PHP, clique aqui .

Tharindu
fonte
6

instalar abaixo das bibliotecas

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

conecte seu mongo db:

mongoose.connect(‘url_here’);

Definir esquema do banco de dados

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

usando o middleware Multer para fazer upload da foto no lado do servidor.

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

pós req para o nosso 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
fonte
Sir e se eu quiser adicionar variedade de Imagens
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);
   }
});

Na sua opinião:

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

Com esse código, você pode adicionar imagens únicas e múltiplas no MongoDB.

AshvinG
fonte
0

Isso funcionou para mim,

  1. Vá para este diretório no CMD: - C: \ Arquivos de Programas \ MongoDB \ Server \ 4.0 \ bin
  2. execute o seguinte comando: - mongofiles put image.jpg
  3. para arquivos selecionados, usamos: - db.fs.files.find.pretty ()
harikesh jaiswal
fonte