如何在flask中显示mysql数据库中的图像

ukdjmx9f  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(564)

我有下面的模型。我成功地将数据插入mysql数据库,但无法在索引页中显示图像。如何在模板中将mysql中的largebinary对象显示为图像?

class ginfo(db.Model):

    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(20))
    comment=db.Column(db.String(1000))
    picdata=db.Column(db.LargeBinary)

我从页面中得到的变量是:

name=request.form['name']
        comment=request.form['comment']
        file=request.files['inputFile']

并将数据插入mysql:

signature=ginfo(name=name,comment=comment,picdata=file.read())
    db.session.add(signature)
    db.session.commit()

我使用以下命令查询整个行和列:

result=ginfo.query.all()
    return render_template('index.html',result=result)

我试图展示如下数据:

{%for r in result%}
<div class="page-header">
<h1>{{r.name}}</h1>
</div>
<div class="well">
<p>{{r.comment}}</p>
</div>
<img src={base64.decodestring(r.picdata)}/>
{%endfor%}
8aqjt8rx

8aqjt8rx1#

例如,您可以通过设置一个路由将图像数据作为响应来解决此问题,例如创建:

@app.route('/img/<int:img_id>')
def serve_img(img_id):
    pass # look up via id, create response with appropriate mimetype

在模板中,请参考以下路线:

{% for r in result %}
<img src="{{ url_for('serve_img', img_id=r.id)}}"
{% endfor %}

另一种方法是使用数据url直接将图像嵌入到响应中,基本上是base64编码数据并直接将其包含在呈现的响应页面中。
我个人会避免使用第二种方法,因为base64编码将使大小增加约30%,而将图像作为数据url嵌入也会阻止客户端进行有效的缓存。

相关问题