GridFS Guide: Sådan uploades filer og billeder til MongoDB nemt ved hjælp af node

Fillagring er en vigtig funktion, der kræves i flere processer på tværs af forskellige applikationstyper. Eksistensen af ​​processer som Content Delivery Networks (CDNs), oprettet gennem tredjeparts skyindstillinger som Amazon Web Services, og lokale fillagringsindstillinger har altid gjort det lettere at opbygge en sådan funktion.

Imidlertid havde begrebet lagring af filer direkte i en database gennem et enkelt API-opkald fascineret mig i nogen tid. Det var her GridFS kom ind i billedet for mig.

GridFS - En lægmandens forståelse

MongoDB har en driver-specifikation til at uploade og hente filer fra den kaldet GridFS. GridFS giver dig mulighed for at gemme og hente filer, som inkluderer filer, der overstiger BSON-dokumentstørrelsesgrænsen på 16 MB .

GridFS tager dybest set en fil og opdeler den i flere stykker, der lagres som individuelle dokumenter i to samlinger:

  • de chunkindsamling (lagrer dokumentet dele), og
  • den filesamling (gemmer den deraf følgende yderligere metadata).

Hver del er begrænset til 255 KB i størrelse. Dette betyder, at den sidste del normalt er lig med eller mindre end 255 KB. Lyder ret pænt.

Når du læser fra GridFS, samler føreren alle klumper efter behov. Dette betyder, at du kan læse sektioner af en fil i henhold til dit forespørgselsområde. Såsom at lytte til et segment af en lydfil eller hente et afsnit i en videofil.  

Bemærk: Det foretrækkes at bruge GridFS til lagring af filer, der normalt overstiger 16 MB størrelse. For mindre filer anbefales det at bruge BinData-formatet til at gemme filerne i enkeltdokumenter.

Dette opsummerer, hvordan GridFS fungerer generelt. Tid til at dyppe vores fødder ned i nogle arbejdskoder og se, hvordan man implementerer et system som sådan.

Nok snak, vis mig koden

Vi bruger Node.js med adgang til en skyinstans af MongoDB til vores opsætning. Du kan finde kodeopbevaringsstedet til prøveapplikationen her.

tarique93102 / gridfs-file-storage Bidrag til tarique93102 / gridfs-file-storage-udvikling ved at oprette en konto på GitHub. tarique93102 GitHub

Vi vil helt fokusere på segmenter af koden, der vedrører funktionerne i GridFS. Vi lærer, hvordan du opsætter det og bruger det til at gemme filer, hente filer eller en bestemt fil og slette en bestemt fil. Lad os starte med det.

Initialiser lagermotoren

De nødvendige pakker til initialisering af motoren er multer-gridfs-storageog multer. Vi bruger også method-overridemiddleware til at aktivere sletning af filer. NPM-modulet cryptobruges til at kryptere filnavne, når de gemmes og læses fra databasen.

Når lagringsmotoren ved hjælp af GridFS er initialiseret, skal du bare kalde den ved hjælp af multer middleware. Den sendes derefter til den respektive rute, der udfører de forskellige fillagringsoperationer.

Initialiser GridFS Stream

Vi initialiserer en GridFS-strøm som det ses i koden nedenfor. Strømmen er nødvendig for at læse filerne fra databasen og også for at hjælpe med at gengive et billede til en browser, når det er nødvendigt.

Upload en enkelt fil eller et billede

Vi genbruger den upload-middleware, vi havde oprettet tidligere.  

Bemærk: Navnet filebruges som en parameter, upload.single()  da vi har nøglen med et lignende navn, der bærer filen, der sendes fra klienten.

Upload flere filer eller billeder

Vi kan også uploade flere filer på én gang. I stedet for upload.single()skal vi blot bruge upload.multiple().

Bemærk: Antallet af uploadede filer kan være mindre end det definerede antal filer.

Hent alle filer fra databasen

Ved hjælp af strømmen initialiseret kan vi hente alle filerne i den bestemte database ved hjælp af gfs.find().toArray(...). Når filerne er opnået, kortlægger vi den til en matrix og sender svaret.

Hent en enkelt fil efter filnavn

Det er superenkelt at forespørge GridFS om en enkelt fil baseret på en bestemt attribut som filename. Ved hjælp af GridFS-strømmen kan du forespørge om databasen gennem funktionen gfs.find({}).

Gør et hentet billede til browseren

Dette er en lidt vanskeligere del, da du ikke kun skal hente en fil fra databasen, men også at gengive den som et billede i den respektive browser. Vi henter filen normalt. Ingen ændring i denne proces.

Derefter ved hjælp af metoden openDownloadStreamByName()på gfs stream kan vi let gengive et billede, da det returnerer en læsbar stream. Når vi har gjort det, kan vi bruge JavaScript pipe()til at streame svaret.

Slet en bestemt fil efter id

Sletning af en fil er lige ligetil. Vi bruger streammetoden delete()med _idparameter til at forespørge og slette den pågældende fil.

Det er de vigtigste funktioner, der tilbydes af lagermotordesignet. Jeg havde udnyttet de diskuterede GridFS-funktioner for at skabe en simpel applikation til upload af billeder. Du kan dykke dybere ned i koden i depotet.

Konklusion

Det tog mig lidt tid og en anstændig kamp for at forstå, hvordan jeg kunne bruge GridFS til et personligt projekt. På grund af dette ville jeg sørge for, at mindst en anden person ikke behøvede at investere den samme tid.

Når det er sagt, vil jeg anbefale at bruge GridFS med forsigtighed. Det er ikke en sølvkugle til alle dine bekymringer om filopbevaring. Alligevel er det en smidig specifikation at kende og være opmærksom på.  

Hvis du har spørgsmål eller bekymringer, kan du kommentere i indlægget eller kontakte mig på LinkedIn.

I mellemtiden skal du fortsætte med at kode.