Python y Flask: Subir archivos al servidor

Hola amigos de Internet, mi nombre es Luis, y les doy la bienvenida a Mi Diario Python.
En el articulo de hoy nos dedicaremos a conocer los métodos para subir archivos con Flask.

Si necesitas información sobre Hosting puedes visitar codigohosting.com

Cuando subimos una foto a Facebook, Facebook la sube a su servidor para poder mostrarla en nuestro muro. Mega, Mediafire, Github, todos ello toman nuestros archivos y los almacenan en su servidor para que luego las otras personas puedan acceder a este, y puedan descargarlo. Creo que se entendió el punto ¿No?.
En muchas ocasiones tendremos que guardar y subir archivos a nuestro servidor. Y hoy te enseñare lo fácil que es hacerlo con Flask.
Prepárate, ponte cómodo, taza de café en mano, y comencemos.
Índice

Formulario de Subida.

Comencemos por el inicio. Lo primero que haremos sera crear el formulario desde donde el usuario seleccionara el archivo a subir.
Crearemos una plantilla, un cuerpo HTML con don entradas: selección del archivo, y enviar.
Recordemos que todas las plantillas que serán renderizadas con Flask deberán estar en un directorio llamado templates.
Aprende más sobre el renderizado de plantillas con Flask: https://www.pythondiario.com/2018/10/renderizar-plantillas-en-flask.html
Así que dentro del directorio templates creare mi archivo HTML:
<form action="/upload" method="POST" enctype="multipart/form-data">
 <input type="file" name="archivo">
 <input type="submit">
</form>
Como pueden observar, es un formulario muy sencillo. Cuando presionemos enviar, la información se enviara a /upload con método POST y tipo de encriptación multipart/form-data. Luego tenemos el input de tipo file con nombre archivo (este nombre archivo lo utilizaremos más tarde).
Muy bien, ya tenemos nuestra plantilla. Es muy simple. Es hora de escribir el script.

Escribiendo el Script

Muy bien es hora de escribir el Script. Mostrare el código completo y luego lo explicare. Y no te asustes, podrá verse complicado, pero es muy simple:
# Importamos todo lo necesario
import os
from flask import Flask, render_template, request
from werkzeug import secure_filename

# instancia del objeto Flask
app = Flask(__name__)
# Carpeta de subida
app.config['UPLOAD_FOLDER'] = './Archivos PDF'

@app.route("/")
def upload_file():
 # renderiamos la plantilla "formulario.html"
 return render_template('formulario.html')

@app.route("/upload", methods=['POST'])
def uploader():
 if request.method == 'POST':
  # obtenemos el archivo del input "archivo"
  f = request.files['archivo']
  filename = secure_filename(f.filename)
  # Guardamos el archivo en el directorio "Archivos PDF"
  f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
  # Retornamos una respuesta satisfactoria
  return "<h1>Archivo subido exitosamente</h1>"

if __name__ == '__main__':
 # Iniciamos la aplicación
 app.run(debug=True)
Comenzamos importando lo necesario. os para subir los archivos en la ruta que deseemos. render_templateFlaskrequest, ya sabemos para que sirven cada uno de ellos. Y secure_filename
Creamos el objeto Flask. Y hacemos una configuración. En este caso app.config[‘UPLOAD_FOLDER’], aquí especificaremos la carpeta en donde se guardaran los archivos que el usuario elija subir. En mi caso, subiré archivos PDF, así que la carpeta se llama Archivos PDF, sí, lo se, soy muy original.
Luego renderizamos la plantilla formulario.html.
Ahora definimos el route de la ruta /uploader y especificamos que en esta ruta se recibirá la información, enviada a través de método POST. Como recordaras, a esta ruta es donde el formulario envía la información.
Luego la aplicación accede al archivo desde el diccionario filesen el objeto de solicitud request.
Obtenemos el nombre del archivo subido por el usuario. Y luego utilizando el método save.
Por ultimo retornamos una respuesta. En este caso, un mensaje diciendo que el archivo se ha subido exitosamente.
Para los que estén interesado. Estoy trabajando de la siguiente manera:
  • Subir Archivos
    • templates
      • formulario.html
    • Subir_Archivos.py
    • Archivos PDF
Quiero dejar en claro, que antes de ejecutar la aplicación, debes crear la carpeta en donde se guardaran los archivos subidos, ya que esta no se creara por si sola.
Una vez aclarado esto, es momento de ejecutar la aplicación. Y dirigirnos a http://localhost:5000:

Vemos el formulario HTML. Solo debemos dar clik en Seleccionar archivo y escoger el archivo a subir.

Yo he escogido un archivo PDF llamada Programación-funcional.pdf. Ahora solo presionamos Enviar y que la magia suceda.
La pagina nos debería redirigir a la siguiente pagina:

Perfecto, este mensaje nos indica que el archivo ya se ha subido. Vamos a comprobarlo.

Excelente, nuestro archivo se ha subido como lo esperábamos.
¿Que te pareció? Muy fácil ¿No lo crees?.
¿Alguna duda? ¿Alguna sugerencia? Déjanos tu comentario y con gusto te responderemos.
Sin más nada que decir, mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
  1. ra dice:

    Genial, justo lo que estaba buscando, una consulta. Se podria guardar el nombre con el que el archivo va a ser guardado en una lista o algo por el estilo?

  2. charlie dice:

    pase casi 1 semana buscando esta informacionn, don luis usted es un crack y desde ya me hare fiel seguidor de tu pagina y le dare click en los anuncios para que te genere algo de ganancia ya q me queda dificil donarte de nuevo mil gracias

  3. Anónimo dice:

    ¡Gracias, Me sirvió bastante! 😀

  4. alexis dice:

    Alguna forma de solucionarlo? Salio este error:
    flask.debughelpers.DebugFilesKeyError: You tried to access the file "archivo" in the request.files dictionary but it does not exist. The mimetype for the request is "application/x-www-form-urlencoded" instead of "multipart/form-data" which means that no file contents were transmitted. To fix this error you should provide enctype="multipart/form-data" in your form.

    The browser instead transmitted some file names. This was submitted: "archivo.mp3"

  5. david dice:

    no me queda claro como hizo la parte de consola y como puso la ruta localhost:5000

  6. Unknown dice:

    hola, el programa funciona bien con el servidor localhost, pero cuando pruebo en un servidor (hosting unix) no lee el archivo, que instrucciones debo incluir para que pueda leer el archivo que esta en el disco c:

  7. Unknown dice:

    el programa funciona bien con el servidor localhost, pero cuando pruebo en un servidor (hosting unix) no lee el archivo, que instrucciones debo incluir para que pueda leer el archivo que esta en el disco c:

  8. Jorge dice:

    Hola, son solo para archivos pdf o puedes subir cualquier archivo, ejemplo un archivo xml o json?

    1. Luis dice:

      Todo tipo de archivo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey