sqlite 使用Flask从DB读取IMG文件并将其渲染为HTML

eqzww0vc  于 2023-08-06  发布在  SQLite
关注(0)|答案(1)|浏览(185)

我试图建立一个非常简单的Flask应用程序,将存储图像和用户信息。我将采取从用户使用HTML上传输入元素上传,并将其保存到数据库。找到了一个教程来保存文件到SQLite3从 flask ,但我无法读取图像,并将其呈现为用户HTML图像使用IMG HTML标签。
下面是用于将图像上传到DB的代码,

class Img(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    img = db.Column(db.Text, unique=True, nullable=False)
    name = db.Column(db.Text, nullable=False)
    mimetype = db.Column(db.Text, nullable=False)

def upload():
    pic = request.files['pic']
    if not pic:
        return 'No pic uploaded!', 400

    filename = secure_filename(pic.filename)
    mimetype = pic.mimetype
    if not filename or not mimetype:
        return 'Bad upload!', 400

    img = Img(img=pic.read(), name=filename, mimetype=mimetype)
    db.session.add(img)
    db.session.commit()

    return 'Img Uploaded!', 200

字符串
当我这么做的时候

Response(img.img, mimetype=img.mimetype)


图像被打开,但无法找到如何将其发送到HTML IMG标签
现在在Index.html中,我想添加上传的IMG

<img src="{{imageURL}}/>"


这种存储图像的方式好吗?

wfauudbj

wfauudbj1#

由于图像数据是二进制形式的,因此我建议使用LargeBinary类型将数据存储在数据库中。
您可以创建自己的终结点来读取和显示图像。在这种情况下,数据是从数据库中提取出来的,并使用send_file函数进行传递。根据您的需要,您可以通过id列(如下例所示)或文件名来标识图像。

flask (app.py)

from flask import (
    Flask,
    abort,
    render_template,
    request,
    send_file
)
from flask_sqlalchemy import SQLAlchemy
from io import BytesIO
from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.gif'}

app = Flask(__name__)
db = SQLAlchemy(app)

class Image(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text, nullable=False)
    data = db.Column(db.LargeBinary, nullable=False)
    mime = db.Column(db.String, nullable=False)

with app.app_context():
    db.drop_all()
    db.create_all()

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        if 'file' not in request.files:
            abort(400, description='No file part.')

        file = request.files['file']
        if file.filename == '':
            abort(400, description='No selected file.')

        if not allowed_file(file.filename):
            abort(400, description='Invalid image.')

        img = Image(
            name=secure_filename(file.filename),
            mime=file.mimetype,
            data=file.read()
        )
        db.session.add(img)
        db.session.commit()
    images = Image.query.all()
    return render_template('index.html', **locals())

@app.route('/download/<int:image_id>')
def download(image_id):
    img = Image.query.get_or_404(image_id)
    return send_file(
        BytesIO(img.data),
        mimetype=img.mime,
        download_name=img.name
    )

字符串

HTML(模板/索引. html)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="file" accept="image/*" />
      <input type="submit" />
    </form>

    <div id="images">
      {% for img in images -%}
      <img src="{{ url_for('download', image_id=img.id) }}" />
      {% endfor -%}
    </div>
  </body>
</html>

相关问题