sql >> Database >  >> NoSQL >> MongoDB

Afbeelding laden vanuit binair (Javascript - Ajax - MongoDB)

Zoals vermeld in de opmerkingen, is het beter om een ​​apart eindpunt in uw toepassing te hebben om deze aanroepen te laten lijken op standaard statische bestandsverzoeken. Dus het eerste wat ik zou doen is je schema een beetje veranderen:

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
}

Dus dat voegt twee velden toe die het "pad" naar de te matchen afbeelding gaan identificeren, en "mime" als het mime-type van het bestand. Dus "pad" is een meer "vriendelijke" identifier dan een _id en het "mime-type" zou in insert worden ingesteld om overeen te komen met het geretourneerde inhoudstype.

Vervolgens stel je een route in om de inhoud te dienen:

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 );
    }); 

})

Dus toen je een verzoek deed zoals:

Dit zou gebeuren:

  • Zoek het document dat overeenkomt met "pad" voor "test.png"

  • Wijs de documenteigenschap voor "picture.mime" toe als het inhoudstype voor het antwoord

  • Stuur de binaire gegevens terug als antwoord

Dus voor de klant is het een echt bestand als antwoord, en het punt is dat de "browser" kan cache dit en niet geraakt uw applicatie waar de kopie in de cache geldig is.

Als u Base64-gecodeerde gegevens insluit in JSON-reacties, dan verliest u verlies dat belangrijke onderdeel en u verzendt de gegevens elke keer. Het is ook een erg rommelig proces om mee om te gaan, zoals je hebt ontdekt.




  1. ID's automatisch verhogen in mangoest

  2. Het bijwerken van het pad 'x' zou een conflict veroorzaken bij 'x'

  3. Kan rollback nog steeds plaatsvinden op een MongoDB-replicaset met J=1 en W=Majority?

  4. Ik probeer een bulk-upsert te doen met Mongoose. Wat is de schoonste manier om dit te doen?