Python Flask descargando un archivo devuelve 0 bytes

Aquí está el código que está ejecutando mi servidor flask:

from flask import Flask, make_response import os app = Flask(__name__) @app.route("/") def index(): return str(os.listdir(".")) @app.route("/") def getFile(file_name): response = make_response() response.headers["Content-Disposition"] = ""\ "attachment; filename=%s" % file_name return response if __name__ == "__main__": app.debug = True app.run("0.0.0.0", port = 6969) 

Si el usuario va al sitio, imprime los archivos en el directorio. Sin embargo, si va al sitio: 6969 / filename, debería descargar el archivo. Sin embargo, estoy haciendo algo mal, ya que el tamaño del archivo siempre es de 0 bytes y el archivo descargado no contiene datos. Alguna idea. Intenté agregar el encabezado de longitud del contenido y eso no funcionó. No sé qué más podría ser.

Todo lo que hace el encabezado es decirle al navegador que trate los datos de respuesta como un archivo descargable con un nombre determinado. En realidad, no establece ningún dato de respuesta, por lo que está en blanco.

Necesitará establecer el contenido del archivo en la respuesta para que funcione.

 @app.route("/") def getFile(file_name): headers = {"Content-Disposition": "attachment; filename=%s" % file_name} with open(file_name, 'r') as f: body = f.read() return make_response((body, headers)) 

EDITAR – Limpie el código un poco basado en api docs

Como escribió Danny, no proporcionas ningún contenido en tu respuesta, por eso obtienes 0 bytes. Sin embargo, hay una función fácil send_file en Flask para devolver el contenido del archivo:

 from flask import send_file @app.route("/") def getFile(file_name): return send_file(file_name, as_attachment=True) 

Tenga en cuenta que el nombre de file_name es relativo a la ruta de la raíz de la aplicación ( app.root_path ) en este caso.