Ръководство за GridFS: Как да качвате файлове и изображения в MongoDB лесно с помощта на Node

Съхранението на файлове е важна функция, необходима в множество процеси в различни видове приложения. Съществуването на процеси като Content Delivery Networks (CDNs), създадени чрез облачни опции на трети страни като Amazon Web Services, и локални опции за съхранение на файлове винаги са улеснявали изграждането на такава функция.

Концепцията за съхранение на файлове директно в база данни чрез едно извикване на API ме заинтригува от доста време. Това е мястото, където GridFS се появи в картината за мен.

GridFS - разбиране на неспециалист

MongoDB има спецификация на драйвера за качване и извличане на файлове от нея, наречена GridFS. GridFS ви позволява да съхранявате и извличате файлове, което включва такива, надвишаващи ограничението за размер на BSON-документа от 16 MB .

GridFS по същество взема файл и го разделя на множество парчета, които се съхраняват като отделни документи в две колекции:

  • на chunkсъбиране (магазините частите на документа), и
  • на fileсъбирането (магазини последващо допълнително метаданни).

Всеки парче е с размер до 255 KB. Това означава, че последното парче обикновено е равно или по-малко от 255 KB. Звучи доста спретнато.

Когато четете от GridFS, драйверът сглобява всички парчета според нуждите. Това означава, че можете да четете раздели на файл според диапазона на заявката ви. Като слушане на сегмент от аудио файл или извличане на част от видео файл.  

Забележка: За предпочитане е да използвате GridFS за съхраняване на файлове, които обикновено надвишават ограничението от 16 MB. За по-малки файлове се препоръчва да използвате формата BinData, за да съхранявате файловете в отделни документи.

Това обобщава как работи GridFS като цяло. Време е да потопим краката си в някакъв работещ код и да видим как да внедрим система като такава.

Стига говори, покажи ми кода

За нашата настройка използваме Node.js с достъп до облачен екземпляр на MongoDB. Можете да намерите хранилището на кода за примерното приложение тук.

tarique93102 / gridfs-file-storage Допринася за развитието на tarique93102 / gridfs-file-storage чрез създаване на акаунт в GitHub. tarique93102 GitHub

Ще се съсредоточим изцяло върху сегменти от кода, които се отнасят до функционалностите на GridFS. Ще научим как да го настроим и да го използваме за съхраняване на файлове, извличане на файлове или определен файл и изтриване на определен файл. Да започнем тогава.

Инициализирайте Storage Engine

Пакетите, необходими за инициализиране на двигателя, са multer-gridfs-storageи multer. Също така използваме method-overrideмеждинния софтуер, за да активираме операцията за изтриване на файлове. Модулът npm cryptoсе използва за криптиране на имената на файловете при съхранение и четене от базата данни.

След като механизмът за съхранение, използващ GridFS, бъде инициализиран, трябва просто да го извикате с помощта на мултер междинния софтуер. След това се предава на съответния маршрут, изпълняващ различните операции за съхранение на файлове.

Инициализирайте GridFS Stream

Инициализираме GridFS поток, както се вижда в кода по-долу. Потокът е необходим за четене на файловете от базата данни, както и за подпомагане на изобразяването на изображение в браузър, когато е необходимо.

Качете един файл или изображение

Използваме повторно междинния софтуер за качване, който сме създали по-рано.  

Забележка: Името fileсе използва като параметър в, upload.single()  тъй като имаме ключа с подобно име, носещ файла, изпращан от клиента.

Качете няколко файла или изображения

Също така можем да качваме няколко файла наведнъж. Вместо upload.single(), трябва просто да използваме upload.multiple().

Забележка: Броят на качените файлове може да бъде по-малък от определения брой файлове.

Изтеглете всички файлове от базата данни

Използвайки инициализирания поток, можем да извлечем всички файлове в конкретната база данни с помощта gfs.find().toArray(...). След като файловете бъдат получени, ние го картографираме в масив и изпращаме отговора.

Вземете един файл по име на файл

Изпълнението на GridFS за един файл е изключително лесно въз основа на конкретен атрибут като filename. Използвайки потока GridFS, можете да запитвате базата данни чрез функцията gfs.find({}).

Предайте извлечено изображение в браузъра

Това е малко по-сложна част, тъй като трябва не само да извлечете файл от базата данни, но и да го изобразите като изображение в съответния браузър. Извличаме файла нормално. Няма промяна в този процес.

След това с помощта на метода openDownloadStreamByName()в gfs stream можем лесно да изобразим изображение, тъй като връща четим поток. След като направихме това, можем да използваме JavaScript pipe()за поточно предаване на отговора.

Изтриване на определен файл по идентификатор

Изтриването на файл е еднакво пряко. Използваме метода на потока delete()с _idпараметър за заявка и изтриване на съответния файл.

Това са основните функционалности, предлагани от дизайна на механизма за съхранение. Бях използвал обсъдените функции на GridFS, за да създам просто приложение за качване на изображения. Можете да се задълбочите в кода в хранилището.

Заключение

Отне ми известно време и прилична борба, за да разбера как да използвам GridFS за личен проект. Поради това исках да се уверя, че поне още един човек не трябва да инвестира същото време.

Като казах това, бих препоръчал да използвате GridFS с повишено внимание. Това не е сребърен куршум за всичките ви опасения за съхранение на файлове. И все пак е чудесна спецификация, която трябва да знаете и да знаете.  

Ако имате някакви въпроси или притеснения, можете да коментирате в публикацията или да се свържете с мен по LinkedIn.

Междувременно продължете да кодирате.