存储在SQLAlchemy LargeBinary列中的服务映像



我想上传一个文件并将其存储在数据库中。我创建了一个LargeBinary列

logo = db.Column(db.LargeBinary)

我读取了上传的文件并将其存储在数据库中。

files = request.files.getlist('file')
if files:
    event.logo = files[0].file.read()

这是在数据库中存储二进制图像的正确方法吗?我如何将二进制数据转换成图像再次显示它?

如果您绝对需要将图像存储在数据库中,那么是的,这是正确的。通常,文件存储在文件系统中,路径存储在数据库中。这是一个更好的解决方案,因为web服务器通常有一个有效的方法从文件系统中提供文件,而不是应用程序动态地发送大量数据。


为图像服务,编写一个获取图像数据并将其作为响应发送的视图。

@app.route('/event/<int:id>/logo')
def event_logo(id):
    event = Event.query.get_or_404(id)
    return app.response_class(event.logo, mimetype='application/octet-stream')
<img src="{{ url_for('event_logo', id=event.id }}"/>

最好使用正确的mime类型而不是application/octet-stream


还可以使用data uri将图像数据直接嵌入到html中。这是次优的,因为每次呈现页面时都会发送数据uri,而图像文件可以由客户端缓存。

from base64 import b64encode
@app.route('/event/<int:id>/logo')
def event_logo(id):
    event = Event.query.get_or_404(id)
    image = b64encode(event.logo)
    return render_template('event.html', event=event, logo=image)
<p>{{ obj.x }}<br/>
{{ obj.y }}</p>
<img src="data:;base64,{{ logo }}"/>

最新更新