Jak je uvedeno v komentářích, je to lepší mít ve své aplikaci samostatný koncový bod, aby tato volání „vypadala jako“ standardní požadavky na statické soubory. Takže první věc já by udělal, je trochu změnit vaše schéma:
picture: {
metadata: {
name: { type: String, default: null },
comment: { type: String, default: null },
publisherID: { type: String,default: null },
date: { type: Date, default: Date.now },
size: { type: Number,default: 0 },
type: { type: String, default: null }
},
path: { type: String, required: true },
mime: { type: String, required: true },
data: { type: Buffer, default: null },
tags: Array
}
To přidá dvě pole, která identifikují "cestu" k obrázku, aby se shodovaly, a "mime" jako typ mime souboru. Takže „cesta“ je „přátelštější“ identifikátor než _id
a "mime-type" by byl nastaven v insertu tak, aby odpovídal vrácenému typu obsahu.
Poté nastavíte trasu pro poskytování obsahu:
app.get('/images/:imgname', function(req,res) {
Picture.find({ "picture.path": req.param("imgname") }, function(err,pic) {
if (err) // checking here
// Sending response
res.set('Content-Type', pic.mime);
res.send( pic[0].picture.data );
});
})
Takže když jste udělali požadavek jako:
Stalo by se toto:
-
Najděte dokument odpovídající "cestě" pro "test.png"
-
Přiřaďte vlastnost document pro "picture.mime" jako Content-Type pro odpověď
-
Odešlete binární data zpět jako odpověď
Takže pro klienta je to skutečný soubor jako odpověď a jde o to, že „prohlížeč“ může ukládat do mezipaměti toto a nezasaženo vaši aplikaci, kde je platná kopie „uložená v mezipaměti“.
Pokud do odpovědí JSON vkládáte data kódovaná Base64, ztratíte tuto důležitou část a data posíláte pokaždé. Je to také velmi komplikovaný proces, jak jste zjistili.