GridFS-Handbuch: So laden Sie Dateien und Bilder mithilfe von Node einfach in MongoDB hoch

Die Speicherung von Dateien ist eine wichtige Funktion, die in mehreren Prozessen für verschiedene Arten von Anwendungen erforderlich ist. Das Vorhandensein von Prozessen wie Content Delivery Networks (CDNs)Cloud-Optionen von Drittanbietern wie Amazon Web Services und lokalen Dateispeicheroptionen hat es immer einfacher gemacht, eine solche Funktion zu erstellen.

Das Konzept, Dateien über einen einzigen API-Aufruf direkt in einer Datenbank zu speichern, hat mich jedoch schon seit einiger Zeit fasziniert. Hier kam GridFS für mich ins Spiel.

GridFS - Das Verständnis eines Laien

MongoDB verfügt über eine Treiberspezifikation zum Hochladen und Abrufen von Dateien namens GridFS. Mit GridFS können Sie Dateien speichern und abrufen, einschließlich solcher, die die Größenbeschränkung für BSON-Dokumente von 16 MB überschreiten .

GridFS nimmt eine Datei grundsätzlich und teilt sie in mehrere Blöcke auf, die als einzelne Dokumente in zwei Sammlungen gespeichert werden:

  • die chunkSammlung (speichert die Dokumentteile) und
  • die fileSammlung (speichert die daraus resultierenden zusätzlichen Metadaten).

Jeder Block ist auf 255 KB begrenzt. Dies bedeutet, dass der letzte Block normalerweise 255 KB oder weniger entspricht. Klingt ziemlich ordentlich.

Wenn Sie aus GridFS lesen, setzt der Treiber alle Blöcke nach Bedarf wieder zusammen. Dies bedeutet, dass Sie Abschnitte einer Datei gemäß Ihrem Abfragebereich lesen können. B. das Abhören eines Segments einer Audiodatei oder das Abrufen eines Abschnitts einer Videodatei.  

Hinweis: Es wird bevorzugt, GridFS zum Speichern von Dateien zu verwenden, die normalerweise die Größenbeschränkung von 16 MB überschreiten. Für kleinere Dateien wird empfohlen, das BinData-Format zu verwenden, um die Dateien in einzelnen Dokumenten zu speichern.

Dies fasst zusammen, wie GridFS im Allgemeinen funktioniert. Zeit, unsere Füße in einen funktionierenden Code zu tauchen und zu sehen, wie ein System als solches implementiert wird.

Genug geredet, zeig mir den Code

Wir verwenden Node.js mit Zugriff auf eine Cloud-Instanz von MongoDB für unser Setup. Das Code-Repository für die Beispielanwendung finden Sie hier.

tarique93102 / gridfs-file-storage Tragen Sie zur Entwicklung von tarique93102 / gridfs-file-storage bei, indem Sie ein Konto auf GitHub erstellen. tarique93102 GitHub

Wir werden uns vollständig auf Segmente des Codes konzentrieren, die sich auf die Funktionen von GridFS beziehen. Wir werden lernen, wie Sie es einrichten und verwenden, um Dateien zu speichern, Dateien oder eine bestimmte Datei abzurufen und eine bestimmte Datei zu löschen. Dann fangen wir an.

Initialisieren Sie die Storage Engine

Die zur Initialisierung der Engine erforderlichen Pakete sind multer-gridfs-storageund multer. Wir verwenden auch method-overrideMiddleware, um den Löschvorgang für Dateien zu aktivieren. Das npm-Modul cryptowird verwendet, um die Dateinamen beim Speichern und Lesen aus der Datenbank zu verschlüsseln.

Sobald die Speicher-Engine mit GridFS initialisiert ist, müssen Sie sie nur noch mit der Multer-Middleware aufrufen. Es wird dann an die jeweilige Route übergeben, die die verschiedenen Dateispeicheroperationen ausführt.

GridFS-Stream initialisieren

Wir initialisieren einen GridFS-Stream wie im folgenden Code gezeigt. Der Stream wird benötigt, um die Dateien aus der Datenbank zu lesen und bei Bedarf ein Bild in einem Browser zu rendern.

Laden Sie eine einzelne Datei oder ein Bild hoch

Wir verwenden die zuvor erstellte Upload-Middleware wieder.  

Hinweis: Der Name filewird als Parameter in verwendet, upload.single()  da wir den Schlüssel mit einem ähnlichen Namen haben, der die vom Client gesendete Datei enthält.

Laden Sie mehrere Dateien oder Bilder hoch

Wir können auch mehrere Dateien gleichzeitig hochladen. Stattdessen upload.single()müssen wir einfach verwenden upload.multiple().

Hinweis: Die Anzahl der hochgeladenen Dateien kann geringer sein als die definierte Anzahl von Dateien.

Holen Sie sich alle Dateien aus der Datenbank

Mit dem initialisierten Stream können wir alle Dateien in der jeweiligen Datenbank mit abrufen gfs.find().toArray(...). Sobald die Dateien erhalten sind, ordnen wir sie einem Array zu und versenden die Antwort.

Holen Sie sich eine einzelne Datei nach Dateinamen

Es ist sehr einfach, GridFS für eine einzelne Datei basierend auf einem bestimmten Attribut wie abzufragen filename. Mit dem GridFS-Stream können Sie die Datenbank über die Funktion abfragen gfs.find({}).

Rendern Sie ein abgerufenes Bild in den Browser

Dies ist etwas kniffliger, da Sie eine Datei nicht nur aus der Datenbank abrufen, sondern auch im jeweiligen Browser als Bild rendern müssen. Wir holen die Datei normal. Keine Änderung in diesem Prozess.

Mit Hilfe der Methode openDownloadStreamByName()für gfs stream können wir dann problemlos ein Bild rendern, da es einen lesbaren Stream zurückgibt. Danach können wir JavaScript verwenden, pipe()um die Antwort zu streamen.

Löschen Sie eine bestimmte Datei nach ID

Das Löschen einer Datei ist ebenso einfach. Wir verwenden die Stream-Methode delete()mit _idParameter, um die betreffende Datei abzufragen und zu löschen.

Dies sind die Hauptfunktionen, die das Design der Speicher-Engine bietet. Ich hatte die besprochenen GridFS-Funktionen genutzt, um eine einfache Anwendung zum Hochladen von Bildern zu erstellen. Sie können tiefer in den Code im Respository eintauchen.

Fazit

Ich brauchte einige Zeit und viel Mühe, um zu verstehen, wie ich GridFS für ein persönliches Projekt nutzen kann. Aus diesem Grund wollte ich sicherstellen, dass mindestens eine andere Person nicht die gleiche Zeit investieren musste.

Trotzdem würde ich empfehlen, GridFS mit Vorsicht zu verwenden. Es ist keine Silberkugel für alle Ihre Dateispeicherprobleme. Trotzdem ist es eine raffinierte Spezifikation, zu wissen und sich dessen bewusst zu sein.  

Wenn Sie Fragen oder Bedenken haben, können Sie dies in dem Beitrag kommentieren oder sich an mich wenden LinkedIn.

Codieren Sie in der Zwischenzeit weiter.