2012-07-19 115 views
5

Entiendo que Mongodb puede almacenar imágenes de dos maneras.Almacenar imágenes en Mongodb servirlas con Nodejs

  1. en un documento normal mediante el almacenamiento de la imagen binaria como
  2. través GridFS para la gestión de imágenes de mayor tamaño.

Por simplicidad y porque las imágenes que planeo servidor son pequeñas, voy a ir a la opción 1.

Para servir las imágenes a un navegador que estoy usando nodejs.

Mi pregunta es ¿qué tan difícil será esto? ¿Cómo se convierten los datos binarios en una imagen real que comprenderá un navegador? ¿Qué tipo de codificación está involucrado?

¿Podría indicarme tutoriales/ejemplos en otro lugar en la web?

Por cierto, sé que esto puede no ser una buena idea por razones de rendimiento, planeo almacenar en caché las imágenes una vez servidas. Solo quiero evitar todo el sistema de archivos.

Respuesta

5

Recomiendo encarecidamente que no se sirvan imágenes de MongoDB.

Sería mejor almacenarlos en un almacén de archivos estáticos (S3) y quizás mantener el camino en MongoDB.


Es probable que utilizar la codificación base64 para poner el archivo en mongodb: http://www.greywyvern.com/code/php/binary2base64/ (o simplemente de utilidad de shell base 64).

Si solo está utilizando documentos normales, entonces el costo de rendimiento es relativamente bajo (siempre que el almacenamiento en caché sea bueno). Si está utilizando una base de datos mixta en la que tiene GridFS y documentos normales, necesitará mucha RAM en su (s) servidor (es): las consultas de GridFS se ejecutarán de manera completamente diferente a las consultas de documentos.

conversión de la imagen podría funcionar así:

var base64Data = imagefile.replace(/^data:image\/png;base64,/,""), 
var dataBuffer = new Buffer(base64Data, 'base64'); 

// below line won't actually work but it's something along the lines of what you want: 

db.foo.insert({magic: 123, etc... img: dataBuffer.toString()}) 
+0

que es muy útil. Ahora tengo una idea de cómo almacenar las imágenes. ¿Podría ampliar su respuesta para incluir cómo puedo servir las imágenes? – jamjam

+0

Quiero decir, ¿dependería de cómo los haya consultado? 'var c = db.foo.find ({nombre_img:" algo "}; console.log (c.img)' Es su servidor, así que ... No estoy del todo seguro de cómo decirle que sirva cosas - Supongo que estás usando el nodo? – ranman

+0

La consulta no es el problema, puedo obtener los datos. ¿Pero qué hago con estos datos binarios para hacer que un navegador web lo represente como una imagen normal? – jamjam

2

Todo lo que necesita hacer para tener su navegador web representar el contenido es enviar las cabeceras correctas y cuerpo de la respuesta.

Por lo tanto, suponiendo que está intentando renderizar una imagen PNG, su tipo MIME sería image/png y luego agregue los bytes de archivos de imagen al cuerpo de la respuesta.

El navegador entonces interpretará esta respuesta como una imagen de tipo PNG y hacerlo apropiadamente

Cuestiones relacionadas