La carga de un archivo PDF a SQL-Alchemy en Python mediante Blob.
Estoy tratando de subir libros en formato PDF a sqlite3. Escribí este código que sube:
- Autor
- Título
- PDF de la historia, pero la porción de blob no parece funcionar aquí:
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()
¿Cómo puedo asegurarme de que el usuario pueda cargar el libro a través de PDF?
Idealmente:
- Quiero que los usuarios carguen historias completas
- Quiero que el tamaño del blob sea muy grande
- No quiero almacenar las historias localmente y luego usar la ruta
- Quiero almacenarlos usando blob.
davy.ai
Para asegurarse de que el usuario pueda cargar el libro como un archivo PDF, es necesario asegurarse de que el archivo se envíe como un archivo binario. Esto se puede lograr utilizando el atributo
enctype="multipart/form-data"
en el elemento de formulario HTML.Para permitir que los usuarios carguen historias completas, puede aumentar el límite de tamaño del blob usando un valor entero grande para el atributo
db.Blob()
. Por ejemplo, puede establecerlo endb.Blob(1000000000)
para permitir la carga de archivos de 1 GB.Para almacenar el archivo como un blob en SQLite3, puede leer el contenido del archivo en modo binario utilizando
open(file, "rb")
. Luego, puede asignar el contenido binario al atributopdf
de la claseBook
.Aquí hay un fragmento de código actualizado para lograr esto:
Y el formulario HTML correspondiente:
Tenga en cuenta que este código asume que el formulario HTML tiene campos con los nombres
title
,author
ypdf
para el título del libro, el autor y el archivo PDF, respectivamente. Puede modificar estos campos para que coincidan con el nombre de los campos correspondientes en su formulario HTML.