Как хранить изображения в mongodb
Перейти к содержимому

Как хранить изображения в mongodb

  • автор:

MongoDB — GridFS

GridFS — это спецификация MongoDB для хранения и извлечения больших файлов, таких как изображения, аудиофайлы, видеофайлы и т. Д. Это своего рода файловая система для хранения файлов, но ее данные хранятся в коллекциях MongoDB. GridFS имеет возможность хранить файлы даже больше, чем его ограничение размера документа 16 МБ.

GridFS делит файл на куски и сохраняет каждый кусок данных в отдельном документе, каждый из которых имеет максимальный размер 255 КБ.

GridFS по умолчанию использует две коллекции fs.files и fs.chunks для хранения метаданных файла и фрагментов. Каждый блок идентифицируется уникальным полем _id ObjectId. Файл fs.files является родительским документом. Поле files_id в документе fs.chunks связывает чанк с его родителем.

Ниже приведен пример документа коллекции fs.files —

 "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646) >

В документе указывается имя файла, размер фрагмента, дата загрузки и длина.

Ниже приведен пример документа fs.chunks —

 "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" >

Добавление файлов в GridFS

Теперь мы будем хранить mp3-файл, используя GridFS, используя команду put . Для этого мы будем использовать утилиту mongofiles.exe, которая находится в папке bin установочной папки MongoDB.

Откройте командную строку, перейдите к файлу mongofiles.exe в папке bin установочной папки MongoDB и введите следующий код —

>mongofiles.exe -d gridfs put song.mp3

Здесь gridfs — это имя базы данных, в которой будет храниться файл. Если база данных отсутствует, MongoDB автоматически создаст новый документ на лету. Song.mp3 — это имя загруженного файла. Чтобы просмотреть документ файла в базе данных, вы можете воспользоваться поиском запроса —

>db.fs.files.find()

Приведенная выше команда вернула следующий документ —

 _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 >

Мы также можем увидеть все фрагменты, присутствующие в коллекции fs.chunks, связанные с сохраненным файлом, со следующим кодом, используя идентификатор документа, возвращенный в предыдущем запросе:

>db.fs.chunks.find(files_id:ObjectId('534a811bf8b4aa4d33fdf94d')>)

В моем случае запрос вернул 40 документов, а это означает, что весь mp3-документ был разделен на 40 блоков данных.

Как мне отправить картинку в базу данных MongoDB?

Мне нужно отправить картинку в базу данных, чтобы потом можно было по запросу ее оттуда получить и отобразить на странице. У меня вопрос в реализации. Кааак? Я поизучал этот вопрос, но там и не смог ничего сделать Можно просто закодировать в base64. (типо ты просто кодируешь и отправляешь это в виде строки я так понимаю, а получаешь и Декодируешь обратно в картинку, это так работает? Если да, то как это сделать?) Пишу на NodeJS express, база данных MongoDB

Отслеживать
задан 4 апр 2021 в 20:01
максим фефилов максим фефилов
1 2 2 бронзовых знака
23 ноя 2021 в 7:26
Я думаю в твоем случая самое простое будет заюзать либу node-base64-image — npm
16 фев 2022 в 18:52

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Хранишь картинку на сервере — в базе путь до неё.

Отслеживать
ответ дан 4 апр 2021 в 20:03
Senbonzakuraa Senbonzakuraa
620 4 4 серебряных знака 18 18 бронзовых знаков
Я не очень понимаю, всмысле на сервере?
4 апр 2021 в 20:05
Как можно ханить картинку на сервере?
4 апр 2021 в 20:05
а где по твоему хранится изображение? на сервере.
4 апр 2021 в 20:05

Гугли «загрузка изборажений на сервер Node.js». Твои пикчи будут лежать где-нить в корне проекта, какая-нить папка uploads, например.

4 апр 2021 в 20:07

При всём уважении к ответу и комментариям, это всё таки ответ не на тот вопрос,котрый был задан. В некотрых случаях хренение картинок в базе предпочтительнее храннеия в файловой системе. С другой стороны, я уверен, что такой код гуглится без особых проблем.

4 апр 2021 в 21:33

Я написал методы с base64, конвертацией в буфер и обратно, записью и чтением из MDB может чем-то тебе поможет.

UPD: url для подключения к mdb изменился.

const mongoClient = require("mongodb").MongoClient; const fs = require('fs'); //const url = 'mongodb://username:[email protected]:12345/terba';// deprecated const url = 'mongodb+srv://:@basName.7jsay.mongodb.net/?retryWrites=true&w=majority'; function mdbConnect(operation, data)< mongoClient.connect(url,< useNewUrlParser: true, useUnifiedTopology: true>, function(err, client)< const db = client.db("terba");//Твоё наименование const collection = db.collection("user");//Твоё наименование if (operation === "update"),//команда для вставки значения data в поле photo в документ с _id:"myPhoto" ,//создаст документ с _id:"myPhoto" полем photo и значением data если такого нет в БД function(err, res)else < console.log(res.result.nModified, res.result.upserted)//На что тебе надо обратить внимание >> ); > if (operation === "find")< console.log(photo)//Здесь твоя фотка в виде Buffer`a let string64 = buffer.toString('base64');//можешь конвертировать в base64 если надо >) > client.close(); >); > function fsr() < let path = "C:\\express\\myProject\\img\\0.jpg" //Это путь к картинке на диске let data = fs.readFileSync(path).toString('base64');//читаешь картинку при помощи fs и конвертишь в base64 let buf = Buffer.from(data, 'base64');//конвертируешь обратно в buffer // console.log(data,buf) mdbConnect("update", buf)//пишешь в mdb буфер, можешь base64 попробовать он в data лежит >mdbConnect("find", "myPhoto")//читаешь из mdb function fsw(data)< fs.writeFileSync("C:\\express\\myProject\\img\\0.jpg", data, 'base64',(err)=>); > let htmlTag = ' '/*создаёшь строку тега img с атрибутом src пишешь туда картинку в base64 отправляешь её клиенту*/ //На клиенте что-то из этого // document.getElementById('as').innerHTML="";//Вставляешь на клиенте в контейнер с id "as" например, или куда тебе надо // function createImg (base64) < //Или в тело документа // var image = new Image(); // image.src = "data:image/jpg;base64,"+base64; // document.body.appendChild(image); //>

БД для чата на MongoDB — где хранить картинки и иные файлы?

Пишу чат, в качестве БД используется MongoDB.
Сущность сообщения помимо текста может содержать картинки и иные типы файлов.
Каким образом лучше хранить файлы? Хранить в БД только ссылки на файлы, а сами файлы на отдельно файловом сервере? Или хранить файлы, используя GridFS?

  • Вопрос задан более трёх лет назад
  • 2908 просмотров

Комментировать
Решения вопроса 3

Файлы лучше хранить в файловой системе. Ощутимый бонус от хранения файла в ФС — можно отдавать напрямую веб-сервером (nginx, apach, etc), не надо для этого куда-то лезть.
Если уж не помещается или нужны какие-то особые фишки — тогда можно и GridFS или другие инструменты.

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Anton @MoonMaster
Программист и этим все сказано

Лично бы я не стал хранить в базе картинки. Заливал бы на сервер или на облачный хостинг, а в БД хранил только ссылку (путь) а потом подгружал.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Если картинки/файлы не большие, то можно и в самом сообщении — одним запросом будет получены и сообщения и файлы, если крупные — то выносить в gridfs/файлы (например как в slack).
Если файлы должны отдаваться только авторизованым (имеющим права), то хранение на диске особо преимуществ не даст (т.к. при раздаче веб сервером, он по прямой ссылке отдаст файлы кому угодно).

Ответ написан более трёх лет назад
Нравится 1 4 комментария

Если файлы должны отдаваться только авторизованым (имеющим права), то хранение на диске особо преимуществ не даст (т.к. при раздаче веб сервером, он по прямой ссылке отдаст файлы кому угодно).

Можно настроить

RidgeA, наверно, но через адские костыли.
как вы сделаете проверку, если в запросе кука/токен, а вам нужно получить пользователя, его группы и соотвествие файла группам? например в nginx?

lega, чисто в nginx — да, через адские костыли в виде LUA или самописных модулей.
Но есть для nginx модуль nginx.org/en/docs/http/ngx_http_auth_request_modul. с помощью которого можно на бек-энд отправить запрос, где проверить права доступа и вернуть соответствующих http код. Дальше либо nginx заворачивает запрос, либо отдает статику. Важно, что на этапе отдачи статики бэк-энд не учавствует.

Если нужно сделать сложную проверку на бекэнде, то потом можно передать nginx internal redirect, чтобы он отдал файл.

Как сохранить фото в MongoDB?

Всем привет!) Нужно с клиента(формы и инпута типа file) принять изображение на сервере, записать его в базу данных (mongo) и потом в случае чего вывести. Это изображение должно быть записано в поле «image» схемы User. Собственно, как это реализовать адекватно ? Или в любом случае нужно делать отдельную коллекцию под изображения?

  • Вопрос задан более трёх лет назад
  • 8359 просмотров

2 комментария

Оценить 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *