为了账号安全,请及时绑定邮箱和手机立即绑定

烧瓶返回存储在数据库中的图像

/ 猿问

烧瓶返回存储在数据库中的图像

幕布斯6054654 2019-12-26 10:31:00

我的图像存储在MongoDB中,我想将它们返回给客户端,代码如下:


@app.route("/images/<int:pid>.jpg")

def getImage(pid):

    # get image binary from MongoDB, which is bson.Binary type

    return image_binary

但是,我似乎无法直接在Flask中返回二进制文件?到目前为止,我的想法是:


返回base64图像二进制文件的。问题是IE <8不支持此功能。

创建一个临时文件,然后使用返回send_file。

有更好的解决方案吗?


查看完整描述

3 回答

?
九州编程

用数据创建一个响应对象,然后设置内容类型标题。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

相关:werkzeug.Headers和flask.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)


查看完整回答
反对 2019-12-26
?
万千封印

只是想确认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')

比手动创建Response对象和设置其标题容易。


查看完整回答
反对 2019-12-26
?
MM们

假设我已经存储了图像路径。以下代码有助于发送图像。


from flask import send_file

@app.route('/get_image')

def get_image():

    filename = 'uploads\\123.jpg'

    return send_file(filename, mimetype='image/jpg')

uploads是我的文件夹名称,其中包含123.jpg的图像。


[PS:上载文件夹应位于脚本文件的当前目录中]


希望能帮助到你。


查看完整回答
反对 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信