Matraz Descargar un archivo

Estoy tratando de crear una aplicación web con Flask que permita a un usuario cargar un archivo y entregarlo a otro usuario. En este momento, puedo cargar el archivo a la carpeta upload_ correctamente. Pero parece que no puedo encontrar una manera de permitir que el usuario vuelva a descargarlo.

Estoy almacenando el nombre del nombre de archivo en una base de datos.

Tengo una vista que sirve los objetos de base de datos. Yo también puedo eliminarlos.

@app.route('/dashboard', methods=['GET', 'POST']) def dashboard(): problemes = Probleme.query.all() if 'user' not in session: return redirect(url_for('login')) if request.method == 'POST': delete = Probleme.query.filter_by(id=request.form['del_button']).first() db.session.delete(delete) db.session.commit() return redirect(url_for('dashboard')) return render_template('dashboard.html', problemes=problemes) 

En mi HTML tengo:

 Facture 

y una vista de descarga:

 @app.route('/uploads/', methods=['GET', 'POST']) def download(filename): return send_from_directory(directory=app.config['UPLOAD_FOLDER'], filename=filename) 

Pero está volviendo:

Extraviado

La URL solicitada no se encontró en el servidor. Si ingresó la URL manualmente, verifique su ortografía y vuelva a intentarlo.

Solo quiero vincular el nombre del archivo al objeto y dejar que el usuario lo descargue (para cada objeto en la misma vista)

Debe asegurarse de que el valor que pase al argumento del directory sea ​​una ruta absoluta, corregida para la ubicación actual de su aplicación.

La mejor manera de hacer esto es configurar UPLOAD_FOLDER como una ruta relativa (sin barra diagonal), luego hacerlo absoluto al añadir current_app.root_path :

 @app.route('/uploads/', methods=['GET', 'POST']) def download(filename): uploads = os.path.join(current_app.root_path, app.config['UPLOAD_FOLDER']) return send_from_directory(directory=uploads, filename=filename) 

Es importante reiterar que UPLOAD_FOLDER debe ser relativo para que esto funcione, por ejemplo, que no comience con un / .

Una ruta relativa podría funcionar, pero se basa demasiado en el directorio de trabajo actual que se establece en el lugar donde vive su código del Frasco. Esto puede no ser siempre el caso.

También estaba desarrollando una aplicación similar. También estaba recibiendo error no encontrado a pesar de que el archivo estaba allí. Esto resuelve mi problema. Menciono mi carpeta de descarga en ‘static_folder’:

 app = Flask(__name__,static_folder='pdf') 

Mi código para la descarga es el siguiente:

 @app.route('/pdf/', methods=['GET', 'POST']) def download(filename): return send_from_directory(directory='pdf', filename=filename) 

Así es como estoy llamando a mi archivo desde html.

 Download pdf  Download png  

Para descargar el archivo en la llamada matraz. El nombre del archivo es Ejemplos.pdf Cuando estoy presionando 127.0.0.1:5000/download , debería descargarse.

Ejemplo:

 from flask import Flask from flask import send_file app = Flask(__name__) @app.route('/download') def downloadFile (): #For windows you need to use drive name [ex: F:/Example.pdf] path = "/Examples.pdf" return send_file(path, as_attachment=True) if __name__ == '__main__': app.run(port=5000,debug=True)