A fájlok tárolása fontos funkció, amelyre a különböző típusú alkalmazások több folyamatában is szükség van. Az olyan folyamatok, mint a Content Delivery Networks (CDNs), a harmadik féltől származó felhő opciók, például az Amazon Web Services, és a helyi fájltárolási lehetőségek létezése mindig is megkönnyítette egy ilyen funkció létrehozását.

A fájlok egyetlen API-híváson keresztül történő közvetlen adatbázisba történő tárolásának koncepciója azonban már jó ideje izgatott. Itt jött számomra a képbe a GridFS.

Vélhetően nem a legjobb módja egy fájltároló rendszer megvalósításának

GridFS – Egy laikus megértése

A MongoDB rendelkezik egy driver specifikációval a fájlok feltöltéséhez és lekérdezéséhez GridFS néven. A GridFS lehetővé teszi a fájlok tárolását és visszakeresését, beleértve a 16 MB-os BSON-dokumentum méretkorlátot meghaladó fájlokat is.

A GridFS alapvetően egy fájlt több darabra bont, amelyek önálló dokumentumként két gyűjteményben tárolódnak:

  • a chunk gyűjtemény (a dokumentumrészeket tárolja), és
  • a file gyűjtemény (az ebből következő további metaadatokat tárolja).

Minden darab mérete 255 KB-ra van korlátozva. Ez azt jelenti, hogy az utolsó chunk általában vagy egyenlő, vagy kisebb, mint 255 KB. Elég jól hangzik.

A GridFS-ből történő olvasáskor az illesztőprogram szükség szerint újra összerakja az összes darabot. Ez azt jelenti, hogy a lekérdezési tartománynak megfelelően olvashatod a fájl egyes szakaszait. Például egy hangfájl egy szegmensének meghallgatása vagy egy videofájl egy szakaszának lehívása.

Megjegyzés: A GridFS használata előnyösebb a 16 MB-os méretkorlátot általában meghaladó fájlok tárolására. Kisebb fájlok esetén ajánlott a BinData formátum használata a fájlok egyes dokumentumokban történő tárolásához.

Ez összefoglalja a GridFS általános működését. Ideje belemártani a lábunkat néhány működő kódba, és megnézni, hogyan lehet egy ilyen rendszert megvalósítani.

Elég a beszédből, mutasd meg a kódot

A beállításunkhoz Node.js-t használunk a MongoDB egy felhőpéldányához való hozzáféréssel. A mintaalkalmazás kódtárát itt találod.

tarique93102/gridfs-file-storage
Társulj a tarique93102/gridfs-file-storage fejlesztéséhez a GitHubon való fiók létrehozásával.
tarique93102GitHub

Teljesen a GridFS funkcionalitásához kapcsolódó kódrészletekre fogunk koncentrálni. Megtanuljuk, hogyan kell beállítani és használni fájlok tárolására, fájlok vagy egy adott fájl visszakeresésére és egy adott fájl törlésére. Akkor kezdjük el.

A tárolómotor inicializálása

A motor inicializálásához szükséges csomagok a multer-gridfs-storage és a multer. A method-override middleware-t is használjuk a fájlok törlési műveletének engedélyezéséhez. Az npm crypto modult használjuk a fájlnevek titkosítására a tároláskor és az adatbázisból való olvasáskor.

Amikor a GridFS-t használó tárolómotor inicializálva van, csak meg kell hívnunk a multer middleware segítségével. Ezt követően átadjuk a megfelelő útvonalnak, amely végrehajtja a különböző fájltárolási műveleteket.

GridFS stream inicializálása

A GridFS streamet az alábbi kódban látható módon inicializáljuk. A streamre azért van szükség, hogy beolvassuk a fájlokat az adatbázisból, valamint azért, hogy szükség esetén segítsen a képet megjeleníteni a böngészőben.

Egyetlen fájl vagy kép feltöltése

Újra felhasználjuk a korábban létrehozott feltöltési middleware-t.

Megjegyzés: A file nevet használjuk paraméterként a upload.single()-ben, mivel a kliens által küldött fájlt hordozó, hasonló nevű kulcsunk van.

Másik fájl vagy kép feltöltése

Másik fájlt vagy képet is feltölthetjük egyszerre. A upload.single() helyett egyszerűen a upload.multiple(<number of files>) értéket kell használnunk.

Figyelem: A feltöltött fájlok száma lehet kevesebb, mint a meghatározott fájlok száma.

Az összes fájl lekérése az adatbázisból

Az inicializált folyamot használva a gfs.find().toArray(...) segítségével lekérhetjük az adott adatbázisban lévő összes fájlt. Miután megkaptuk a fájlokat, leképezzük egy tömbre, és elküldjük a választ.

Egyetlen fájl lekérdezése fájlnév alapján

Szuper egyszerű lekérdezni a GridFS-t egyetlen fájlra egy adott attribútum alapján, például filename. A GridFS stream segítségével a gfs.find({<add query here>}) függvényen keresztül lekérdezhetjük az adatbázist.

Rendering a Fetched Image to Browser

Ez egy kicsit trükkösebb rész, mivel nem csak le kell hívnunk egy fájlt az adatbázisból, hanem képként is kell megjelenítenünk az adott böngészőben. Normálisan lekérjük a fájlt. Ebben a folyamatban nincs változás.

Ezután a gfs stream openDownloadStreamByName() metódusának segítségével könnyedén megjeleníthetünk egy képet, mivel az egy olvasható streamet ad vissza. Miután ez megtörtént, a JavaScript pipe() segítségével streamelhetjük a választ.

Delete a Particular File by Id

A fájl törlése ugyanilyen egyszerű. A delete() stream metódust delete() használjuk _id paraméterrel az érintett fájl lekérdezéséhez és törléséhez.

Ezek a főbb funkciók, amelyeket a storage engine tervezése kínál. A tárgyalt GridFS funkciókat egy egyszerű képfeltöltő alkalmazás létrehozásához használtam ki. A kódban mélyebben el lehet mélyedni a reszorpozícióban.

Következtetés

Egy kis időbe és tisztességes küzdelembe került, mire megértettem, hogyan lehet a GridFS-t egy személyes projektben felhasználni. Emiatt szerettem volna biztosítani, hogy legalább egy másik személynek ne kelljen ugyanannyi időt befektetnie.

Azt mondtam, hogy a GridFS használatát csak óvatosan ajánlom. Ez nem egy ezüstgolyó az összes fájltárolási problémádra. Mégis, ez egy ügyes specifikáció, amit érdemes ismerni és tisztában lenni vele.

Articles

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.