我有以下模型。我已成功将数据插入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%}

最佳答案

例如,您可以通过提供一条路线来将图像数据作为响应来解决此问题,例如创建:

@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 %}


另一种方法是使用data url直接将图像嵌入响应中,基本上使用base64对数据进行编码,然后将其直接包含在渲染的响应页面中。

我个人避免使用第二种方法,因为编码为base64将使大小增加约30%,并且将图像嵌入为数据url也将阻止客户端进行有效的缓存。

08-07 07:19
查看更多