Frasco para devolver la imagen almacenada en la base de datos.

Mis imágenes se almacenan en un MongoDB, y me gustaría devolverlas al cliente, aquí es cómo está el código

@app.route("/images/.jpg") def getImage(pid): # get image binary from MongoDB, which is bson.Binary type return image_binary 

Sin embargo, ¿parece que no puedo devolver el binario directamente en Flask? Mi idea hasta ahora:

  1. Devuelve la base64 de la imagen binaria. El problema es que IE <8 no soporta esto.
  2. Cree un archivo temporal y luego devuélvalo con send_file .

¿Hay mejores soluciones?

Cree un objeto de respuesta con los datos y luego configure el encabezado de tipo de contenido. Establezca el encabezado de disposición de contenido en attachment si desea que el navegador guarde el archivo en lugar de mostrarlo.

 @app.route('/images/.jpg') def get_image(pid): image_binary = read_image(pid) response = make_response(image_binary) response.headers.set('Content-Type', 'image/jpeg') response.headers.set( 'Content-Disposition', 'attachment', filename='%s.jpg' % pid) return response 

Relevante: werkzeug.Headers and flask.Response

Puede pasar un objeto de tipo archivo a y los argumentos del encabezado a send_file para permitir que configure la respuesta completa. Utilice io.BytesIO para datos binarios:

 return send_file( io.BytesIO(image_binary), mimetype='image/jpeg', as_attachment=True, attachment_filename='%s.jpg' % pid) 

Solo quería confirmar que la segunda sugerencia de dav1d es correcta: probé esto (donde obj.logo es un ImageField de Mongoengine), funciona bien para mí:

 import io from flask import current_app as app from flask import send_file from myproject import Obj @app.route('/logo.png') def logo(): """Serves the logo image.""" obj = Obj.objects.get(title='Logo') return send_file(io.BytesIO(obj.logo.read()), attachment_filename='logo.png', mimetype='image/png') 

Más fácil que crear manualmente un objeto de Respuesta y configurar sus encabezados.

Supongamos que tengo la ruta de la imagen almacenada conmigo. El siguiente código ayuda a enviar la imagen a través.

 from flask import send_file @app.route('/get_image') def get_image(): filename = 'uploads\\123.jpg' return send_file(filename, mimetype='image/jpg') 

uploads es el nombre de mi carpeta donde está presente mi imagen con 123.jpg.

[PS: La carpeta de subidas debe estar en el directorio actual a partir del archivo de script]

Espero eso ayude.