【问题标题】:Uploading pdf to sql-alchemy in python using blob使用blob在python中将pdf上传到sql-alchemy
【发布时间】:2021-12-30 17:50:35
【问题描述】:

我正在尝试以 pdf 的形式将书籍上传到 sqlite3。我写了这个上传的代码:

  • 作者
  • 标题
  • 故事的 pdf,但 blob 部分似乎在这里不起作用:
class Book(UserMixin, db.Model):

        id = db.Column(db.Integer, primary_key=True)
        author = db.Column(db.String(50), unique=False)
        title = db.Column(db.String(50), unique=False)
        pdf= db.Column(db.Blob(10000000))
    
    @app.route('/uploadStory', methods=['GET', 'POST'])
    def uploadStory():
        new_book = Book(author=form.author.data, title=form.title.data, pdf=form.pdf.data)
        db.session.add(new_book)
        db.session.commit()

如何确保用户能够通过 PDF 上传图书?理想情况下

  • 我希望用户上传整个故事
  • 我希望 blob 大小非常大
  • 我不想在本地存储故事然后使用路径
  • 我想使用 blob 存储它们

【问题讨论】:

    标签: python sql flask sqlalchemy blob


    【解决方案1】:

    我不知道如何使用 SQLAlchemy 做到这一点,但这里是普通的 Python/Flask 方式:

    from flask import Flask, render_template, request, redirect, url_for
    import sqlite3
    
    app = Flask(__name__)
    
    def insert_user_data(author, title, pdf):
        con = sqlite3.connect("user_data.sqlite")
        cur = con.cursor()
        query = """
            INSERT INTO user_data (author, title, pdf) VALUES (?, ?, ?);
        """
        cur.execute(query, [author, title, pdf])
        con.commit()
    
    
    @app.route("/", methods=["GET", "POST"])
    def home():
        if request.method == "POST":
            pdf = request.files["pdf"].read()
            author = request.form["author"]
            title = request.form["title"]
            insert_user_data(author, title, pdf)
            return redirect(url_for("home"))
    
        return render_template("index.html")
    

    假设这个数据库架构:

    CREATE TABLE user_data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        author TEXT,
        title TEXT,
        pdf BLOB
    );
    

    还有一个简单的index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Save PDF</title>
        <style>
            input {
                display: block;
            }
        </style>
    </head>
    <body>
        <form method="POST" action="{{ url_for('home') }}" enctype="multipart/form-data">
            <input type="text" name="author" placeholder="author" />
            <input type="text" name="title" placeholder="title" />
            <input type="file" name="pdf" />
            <button type="submit">Submit</button>
        </form>
    </body>
    </html>
    

    当我运行它,然后运行另一个脚本以从数据库中提取 pdf 并写入文件(以查看它是否有效)时,一切看起来都很好:

    import sqlite3
    
    con = sqlite3.connect("user_data.sqlite")
    cur = con.cursor()
    
    query = """
        SELECT pdf FROM user_data WHERE id = 1;
    """
    
    result = cur.execute(query).fetchone()[0]
    
    with open("think-python.pdf", mode="wb") as file:
        file.write(result)
    
    

    这是生成的文件结构:

    ➜  blob-pdf ls
    app.py  main.py  __pycache__  schema.sql  templates  think-python.pdf  user  user_data.sqlite
    ➜  blob-pdf file think-python.pdf
    think-python.pdf: PDF document, version 1.5
    

    这是从数据库中提取后的文件:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 2021-09-07
      • 2020-01-09
      • 2021-06-20
      • 1970-01-01
      • 2018-10-01
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多