sql >> Base de Datos >  >> NoSQL >> MongoDB

Cargar imagen desde binario (Javascript - Ajax - MongoDB)

Como se indica en los comentarios, es mejor tener un punto final separado en su aplicación para hacer que estas llamadas "parezcan" solicitudes de archivos estáticos estándar. Así que lo primero que yo haría es cambiar su esquema un poco:

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
}

Eso agrega dos campos que identificarán la "ruta" a la imagen para que coincida, y "mime" como el tipo mime del archivo. Entonces, "ruta" es un identificador más "amigable" que un _id y el "tipo mimo" se establecería en la inserción para que coincida con el tipo de contenido devuelto.

Luego configura una ruta para servir el contenido:

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

})

Entonces, cuando hiciste una solicitud como:

Esto sucedería:

  • Encuentre la "ruta" de correspondencia del documento para "test.png"

  • Asigne la propiedad del documento para "imagen.mimo" como tipo de contenido para la respuesta

  • Envíe los datos binarios como respuesta

Entonces, para el cliente, es un archivo real como respuesta, y el punto es que el "navegador" puede almacenar en caché esto y no golpear su aplicación donde la copia "almacenada" es válida.

Si está incrustando datos codificados en Base64 en respuestas JSON, entonces pierde esa parte importante y envías los datos cada vez. También es un proceso muy complicado de manejar, como ha descubierto.