使用blob在python中将pdf上传到sql-alchemy
Posted
技术标签:
【中文标题】使用blob在python中将pdf上传到sql-alchemy【英文标题】:Uploading pdf to sql-alchemy in python using blob 【发布时间】: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 存储它们【问题讨论】:
【参考方案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
这是从数据库中提取后的文件:
【讨论】:
以上是关于使用blob在python中将pdf上传到sql-alchemy的主要内容,如果未能解决你的问题,请参考以下文章
Azure:使用容器创建存储帐户并在 Python 中将 blob 上传到其中
存储在 Microsoft SQL 中的 Python blob PDF - 转换回 PDF
如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel
尝试使用 PUT 将 PDF 作为 blob 上传到 S3 存储桶时被禁止 403