Neviem, ako to urobiť pomocou SQLAlchemy, ale tu je vanilka Python/Banky spôsobom:
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 IGNORE 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")
Predpokladá sa, že táto DB schéma:
CREATE TABLE IF NOT EXISTS user_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
author TEXT,
title TEXT,
pdf BLOB
);
A jednoduchý 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>
Keď som spustiť, a potom spustiť iný skript vytiahnuť pdf
z DB a zapisovať do súboru (vidieť, či to fungovalo), všetko vyzerá dobre:
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)
Tu je výsledná štruktúra súborov:
➜ 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
A tu je súbor po vytiahnutí z DB: