我的图像存储在Mysql中,我想将它们返回给客户端
用数据创建一个响应对象,然后设置内容类型标题。attachment如果希望浏览器保存文件而不显示文件,则将内容处置标题设置为。
@app.route('/images/<int:pid>.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
您可以将类似文件的Oject和header参数传递send_file给它,以设置完整的响应。使用io.BytesIO二进制数据:
return send_file(
io.BytesIO(image_binary),
mimetype='image/jpeg',
as_attachment=True,
attachment_filename='%s.jpg' % pid)
只是想确认dav1d的第二个建议是正确的-我对此进行了测试(其中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')
以下是传文件适用于Python 3.7.3):
import io
import base64
def get_image(image_path):
img = Image.open(image_path, mode='r')
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
encoded_img = base64.encodebytes(img_byte_arr.getvalue()).decode('ascii')
return encoded_img
...
# your code
...
image = get_image(img_path)
# prepare the response: data
data["key"] = {"key1": value1, "key2": value2, "image": image}
return flask.jsonify(data)
我的代码
img_record = db.session.query(ImageInfo).filter(
ImageInfo.id == img_id).first()
response = make_response(base64.b64decode(img_record.image))
response.headers['Content-Type'] = 'image/png'
response.headers['Content-Disposition'] = 'inline;filename=' + \
str(img_record.id) + '.png'
return response
这是返回下载文件
io.BytesIO(base64.b64decode(img_record.image)
return send_file(io.BytesIO(base64.b64decode(img_record.image)),
mimetype='image/jpeg',as_attachment=True,attachment_filename='%d.jpg' % img_record.id)