es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.
Tags:  , , , ,

Answer

  1. Avatar for 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 en db.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 atributo pdf de la clase Book.

    Aquí hay un fragmento de código actualizado para lograr esto:

    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.LargeBinary())
    
    @app.route('/uploadStory', methods=['GET', 'POST'])
    def uploadStory():
        if request.method == 'POST':
            new_book = Book(author=request.form['author'], title=request.form['title'])
    
            file = request.files['pdf']
            file_content = file.read()
    
            new_book.pdf = file_content
            db.session.add(new_book)
            db.session.commit()
            return 'Archivo cargado correctamente'
    
        return render_template('upload.html')
    

    Y el formulario HTML correspondiente:

    <form method="post" action="{{ url_for('uploadStory') }}" enctype="multipart/form-data">
        <label for="title">Título:</label>
        <input type="text" name="title" id="title"><br>
        <label for="author">Autor:</label>
        <input type="text" name="author" id="author"><br>
        <label for="pdf">Archivo PDF:</label>
        <input type="file" name="pdf" id="pdf"><br>
        <input type="submit" value="Cargar">
    </form>
    

    Tenga en cuenta que este código asume que el formulario HTML tiene campos con los nombres title, author y pdf 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.

Comments are closed.