Przechowuj obrazy w bazie danych MongoDB

174

Jak mogę przechowywać obrazy w bazie danych MongoDB, a nie tylko tekst? Czy mogę utworzyć tablicę obrazów w bazie danych MongoDB? Czy będzie można zrobić to samo z filmami?

Chani
źródło
1
Krótka odpowiedź brzmi: tak, możesz przechowywać (małe) obrazy, jeśli zakodujesz je poprawnie za pomocą base64, zobacz stackoverflow.com/questions/11442356. Znalazłem również menge.io/2015/03/24/storing-small-images-in- mongodb to bardzo dobry punkt wyjścia.
B - rian

Odpowiedzi:

108

Szczegółowe informacje na temat przechowywania takich danych binarnych można znaleźć w dokumentacji GridFS .

Link do wsparcia dla Twojego konkretnego języka powinien znajdować się u dołu ekranu.

Gates VP
źródło
40
GridFS jest przeznaczony dla dokumentów> 16 MB. Nie wszystkie dane binarne są tak duże. Oprócz możliwości przekroczenia tego limitu, czy są jakieś inne korzyści z używania GridFS zamiast tylko typu BinData?
Brandon Fitzpatrick
3
Filmy mają zwykle rozmiar> 16 MB, więc ta odpowiedź jest prawdopodobnie rozsądna. Powinienem jednak o tym wspomnieć.
Chanoch
1
jakieś inne rozwiązanie, zamiast korzystania z GridFS?
Abhishek Mani
1
@AbhishekMani innym rozwiązaniem jest w ogóle nie przechowywać ich w MongoDB. Teraz, w 2018 roku, zapisywanie tych danych do czegoś takiego jak magazyn Amazon S3 lub Azure BLOB jest nieskończenie łatwiejszy.
Wiceprezes Gates
Myślę, co mówi MongoDB
xinbenlv
64

„Do przechowywania plików większych niż 16 MB należy zawsze używać GridFS” - Kiedy należy używać GridFS?

Dokumenty MongoDB BSON są ograniczone do 16 MB. Więc jeśli całkowity rozmiar twojej tablicy plików jest mniejszy, możesz przechowywać je bezpośrednio w swoim dokumencie przy użyciu typu danych BinData .

Filmy, obrazy, pliki PDF, arkusze kalkulacyjne itp. - nie ma znaczenia, wszystkie są traktowane tak samo. Do aplikacji należy zwrócenie odpowiedniego nagłówka typu zawartości w celu ich wyświetlenia.

Sprawdź dokumentację GridFS, aby uzyskać więcej informacji.

Mike Causer
źródło
24

Możesz spróbować tego:

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
źródło
13

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

W NPM dostępna jest wtyczka Mongoose o nazwie mongoose-file. Pozwala dodać pole pliku do schematu Mongoose w celu przesłania pliku. Nigdy go nie używałem, ale może się przydać. Jeśli obrazy są bardzo małe, możesz je zakodować w Base64 i zapisać ciąg w bazie danych.

Przechowywanie małych (poniżej 1 MB) plików w MongoDB w NodeJS BEZ GridFS

Mick Cullen
źródło
8

Możesz użyć typu danych bin, jeśli używasz dowolnego języka skryptowego do przechowywania plików / obrazów w MongoDB. Dane bin są opracowywane w celu przechowywania małych rozmiarów plików.

Zapoznaj się ze sterownikiem języka skryptowego. W przypadku PHP kliknij tutaj .

Tharindu
źródło
6

zainstaluj poniżej biblioteki

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

podłącz swoją bazę danych mongo:

mongoose.connect(‘url_here’);

Zdefiniuj schemat bazy danych

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

używając oprogramowania pośredniego Multer, aby przesłać zdjęcie po stronie serwera.

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

post req do naszej bazy danych

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
źródło
Proszę pana, jeśli chcę dodać tablicę zdjęć
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);
   }
});

Twoim zdaniem:

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

Za pomocą tego kodu możesz dodawać pojedyncze lub wiele obrazów w MongoDB.

AshvinG
źródło
0

To zadziałało dla mnie,

  1. Przejdź do tego katalogu W CMD: - C: \ Program Files \ MongoDB \ Server \ 4.0 \ bin
  2. wykonaj następujące polecenie: - mongofiles put image.jpg
  3. dla wybranych plików używamy: - db.fs.files.find.pretty ()
harikesh jaiswal
źródło