Οδηγός GridFS: Πώς να ανεβάσετε αρχεία και εικόνες στο MongoDB εύκολα χρησιμοποιώντας τον κόμβο

Η αποθήκευση αρχείων είναι ένα σημαντικό χαρακτηριστικό που απαιτείται σε πολλές διαδικασίες σε διάφορους τύπους εφαρμογών. Η ύπαρξη διαδικασιών όπως Content Delivery Networks (CDNs), η ρύθμιση μέσω επιλογών cloud τρίτων, όπως το 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 με πρόσβαση σε μια παρουσία cloud του MongoDB για την εγκατάστασή μας. Μπορείτε να βρείτε το αποθετήριο κώδικα για την εφαρμογή δείγματος εδώ.

tarique93102 / gridfs-file-storage Συμβάλλετε στην ανάπτυξη tarique93102 / gridfs-file-storage δημιουργώντας έναν λογαριασμό στο GitHub. tarique93102 GitHub

Θα επικεντρωθούμε πλήρως σε τμήματα του κώδικα που σχετίζονται με τις λειτουργίες του GridFS. Θα μάθουμε πώς να το ρυθμίσουμε και να το χρησιμοποιούμε για την αποθήκευση αρχείων, την ανάκτηση αρχείων ή ενός συγκεκριμένου αρχείου και τη διαγραφή ενός συγκεκριμένου αρχείου. Ας ξεκινήσουμε τότε.

Αρχικοποιήστε τη μηχανή αποθήκευσης

Τα πακέτα που απαιτούνται για την προετοιμασία του κινητήρα είναι multer-gridfs-storageκαι multer. Χρησιμοποιούμε επίσης το method-overridemiddleware για να ενεργοποιήσουμε τη λειτουργία διαγραφής για αρχεία. Η μονάδα npm cryptoχρησιμοποιείται για την κρυπτογράφηση των ονομάτων αρχείων κατά την αποθήκευση και ανάγνωση από τη βάση δεδομένων.

Μόλις ξεκινήσει η μηχανή αποθήκευσης που χρησιμοποιεί το GridFS, πρέπει να την καλέσετε χρησιμοποιώντας το multer middleware. Στη συνέχεια μεταφέρεται στην αντίστοιχη διαδρομή εκτελώντας τις διάφορες λειτουργίες αποθήκευσης αρχείων.

Αρχικοποιήστε τη ροή 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.

Εν τω μεταξύ, συνεχίστε την κωδικοποίηση.