I’m trying to add a button in my dash application (which is embedded in a Flask server) to download a file previously generated containing data and graphs extracted from a SQL database from my XAMPP Server in my laptop to another device.
But what I get is an empty file which I can’t open, it says there is a problem with the content. But I checked several times that the original file is in the folder and it can be opened and see the content.
Hello,
if you want to download a file, you should use the Flask routing with one of the functions (send_file or send_from_directory), more information can be found here
here is a simple example :
import dash
import dash_bootstrap_components as dbc
import dash_html_components as html
from dash.dependencies import Input, Output
from flask import Flask,send_from_directory
server = Flask(__name__)
app = dash.Dash(server=server)
# leave it blank if your file is in the root
#otherwise add name of the folder here
FILE_DIRECTORY = ""
app.layout = html.A(html.Button('Download file'), href="Download/File.xlsx")
@server.route("/Download/<path:path>")
def download(path):
return send_from_directory(FILE_DIRECTORY, path, as_attachment=True)
if __name__ == '__main__':
app.run_server(debug=True)
You can also check this thread where send_file is used to do the same
BOOM! It worked! Thank you (again) so much. I thought path:path was an operator to substitute but it was literal!
I’m a newbie at Flask and I have a stupid doubt to be answered if you don’t mind
How does the href connect to the download function of @server.route to obtain the value of path through the path:path thing?
i don’t have such experience with Flask, but for the href and the path:path thing, it is useful when dealing with many files to be downloaded not only one, that path:path is the way used in Flask to pass a parameter (in this case the name of the file) to the function , in your example you have only one file to donwload so you don’t need to have the “/Download/path:path”, you can put anything in href (for example just Download or getFIle etc) as long as you keep the same thing in server.route so Flask can execute the function related to that route when you click on the link. and remove the path argument from the function since its only one file which is known, and this way it will also work.
even other web frameworks use the same routing concept. Please if your issue with downloading files is solved dont forget to close the thread by selecting it as the correct answer.
I have an issue. When i execute my code i am not able to download files. I am downloading an empty file. I tried to work from incognito but it doesnt help too. Can you give me a robust solution for the same