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

发布于 2021-01-29 19:01:11

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

logo = db.Column(db.LargeBinary)

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

files = request.files.getlist('file')

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

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

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您绝对需要将图像存储在数据库中,那么是的,这是正确的。通常,文件存储在文件系统中,路径存储在数据库中。这是更好的解决方案,因为与动态发送大量数据的应用程序不同,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 }}"/>
    

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


    您也可以使用数据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 }}"/>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看