Посібник GridFS: Як легко завантажити файли та зображення до MongoDB за допомогою Node

Зберігання файлів є важливою функцією, необхідною в багатьох процесах для різних типів програм. Існування таких процесів, як Content Delivery Networks (CDNs), налаштовані за допомогою сторонніх хмарних опцій, таких як Amazon Web Services, та локальних варіантів зберігання файлів завжди полегшувало створення такої функції.

Однак концепція зберігання файлів безпосередньо в базі даних за допомогою одного виклику API заінтригувала мене досить давно. Саме тут для мене з’явився GridFS.

GridFS - Розуміння неспеціаліста

MongoDB має специфікацію драйвера для завантаження та отримання файлів з неї під назвою GridFS. GridFS дозволяє зберігати та отримувати файли, що включає файли, що перевищують обмеження розміру документа BSON у 16 МБ .

GridFS в основному бере файл і розбиває його на кілька фрагментів, які зберігаються як окремі документи у двох колекціях:

  • в chunkколекції (зберігає частини документа), і
  • fileколекції (магазини , як наслідок , додаткові метадані).

Розмір кожного фрагмента обмежений 255 КБ. Це означає, що останній шматок зазвичай дорівнює або менше 255 КБ. Звучить досить акуратно.

Коли ви читаєте з GridFS, драйвер за необхідності збирає всі фрагменти. Це означає, що ви можете читати розділи файлу відповідно до вашого діапазону запитів. Наприклад, прослуховування сегмента аудіофайлу або отримання розділу відеофайлу.  

Примітка. Переважно використовувати GridFS для зберігання файлів, які зазвичай перевищують обмеження розміру 16 МБ. Для менших файлів рекомендується використовувати формат BinData для зберігання файлів в окремих документах.

Це підсумовує принцип роботи GridFS загалом. Час зануритись у якийсь робочий код і подивитися, як впровадити систему як таку.

Досить говори, покажи мені код

Для нашого налаштування ми використовуємо Node.js з доступом до хмарного екземпляра MongoDB. Тут ви можете знайти сховище коду для зразка програми.

tarique93102 / gridfs-file-storage Допоможіть розробці tarique93102 / gridfs-file-storage, створивши обліковий запис на GitHub. tarique93102 GitHub

Ми повністю зосередимось на сегментах коду, які стосуються функціональних можливостей GridFS. Ми дізнаємося, як його налаштувати та використовувати для зберігання файлів, отримання файлів або певного файлу та видалення певного файлу. Почнемо тоді.

Ініціалізуйте механізм зберігання

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

Як тільки механізм зберігання за допомогою GridFS ініціалізується, вам потрібно просто викликати його за допомогою багатопрофільного проміжного програмного забезпечення. Потім він передається на відповідний маршрут, виконуючи різні операції зберігання файлів.

Ініціалізуйте потік GridFS

Ми ініціалізуємо потік GridFS, як показано в коді нижче. Потік необхідний для читання файлів з бази даних, а також для надання візуалізації зображення в браузері, коли це потрібно.

Завантажте один файл або зображення

Ми повторно використовуємо проміжне програмне забезпечення для завантаження, створене нами раніше.  

Примітка: Ім'я fileвикористовується як параметр, upload.single()  оскільки у нас є ключ із подібним іменем, що містить файл, який надсилається від клієнта.

Завантажте кілька файлів або зображень

Ми також можемо завантажувати кілька файлів одночасно. Замість upload.single(), ми повинні просто використовувати upload.multiple().

Примітка: Кількість завантажених файлів може бути меншою за визначену кількість файлів.

Отримати всі файли з бази даних

За допомогою ініціалізованого потоку ми можемо отримати всі файли в певній базі даних gfs.find().toArray(...). Після отримання файлів ми відображаємо його в масив і передаємо відповідь.

Отримати один файл за назвою файлу

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

Візуалізуйте отримане зображення у браузері

Це дещо складніша частина, оскільки вам потрібно не лише отримати файл із бази даних, але й відтворити його як зображення у відповідному браузері. Ми отримуємо файл нормально. Ніяких змін у цьому процесі.

Тоді за допомогою методу openDownloadStreamByName()на потоці gfs ми можемо легко відтворити зображення, оскільки воно повертає читабельний потік. Зробивши це, ми можемо використовувати JavaScript pipe()для передачі відповіді.

Видаліть певний файл за ідентифікатором

Видалення файлу однаково просто. Ми використовуємо метод потоку delete()з _idпараметром для запиту та видалення відповідного файлу.

Це основні функціональні можливості, запропоновані конструкцією механізму зберігання. Я використав обговорені функції GridFS, щоб створити простий додаток для завантаження зображень. Ви можете глибше заглибитися в код у сховищі.

Висновок

Мені знадобився певний час і пристойна боротьба, щоб зрозуміти, як використовувати GridFS для особистого проекту. Через це я хотів переконатись, що принаймні ще одній людині не довелося б вкладати стільки часу.

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

Якщо у вас є запитання чи сумніви, ви можете залишити коментар у дописі або зв’язатися зі мною LinkedIn.

Тим часом продовжуйте кодувати.