Display a download button widget.
This is useful when you would like to provide a way for your users to download a file directly from your app.
Note that the data to be downloaded is stored in-memory while the user is connected, so it's a good idea to keep file sizes under a couple hundred megabytes to conserve memory.
If you want to prevent your app from rerunning when a user clicks the download button, wrap the download button in a fragment.
Function signature[source] | |
---|---|
st.download_button(label, data, file_name=None, mime=None, key=None, help=None, on_click="rerun", args=None, kwargs=None, *, type="secondary", icon=None, disabled=False, use_container_width=False) | |
Parameters | |
label (str) | A short label explaining to the user what this button is for. The label can optionally contain GitHub-flavored Markdown of the following types: Bold, Italics, Strikethroughs, Inline Code, Links, and Images. Images display like icons, with a max height equal to the font height. Unsupported Markdown elements are unwrapped so only their children (text contents) render. Display unsupported elements as literal characters by backslash-escaping them. E.g., "1\. Not an ordered list". See the body parameter of st.markdown for additional, supported Markdown directives. |
data (str, bytes, or file) | The contents of the file to be downloaded. To prevent unncecessary recomputation, use caching when converting your data for download. For more information, see the Example 1 below. |
file_name (str) | An optional string to use as the name of the file to be downloaded, such as "my_file.csv". If not specified, the name will be automatically generated. |
mime (str or None) | The MIME type of the data. If this is None (default), Streamlit sets the MIME type depending on the value of data as follows:
For more information about MIME types, see https://www.iana.org/assignments/media-types/media-types.xhtml. |
key (str or int) | An optional string or integer to use as the unique key for the widget. If this is omitted, a key will be generated for the widget based on its content. No two widgets may have the same key. |
help (str or None) | A tooltip that gets displayed when the button is hovered over. If this is None (default), no tooltip is displayed. The tooltip can optionally contain GitHub-flavored Markdown, including the Markdown directives described in the body parameter of st.markdown. |
on_click (callable, "rerun", "ignore", or None) | How the button should respond to user interaction. This controls whether or not the button triggers a rerun and if a callback function is called. This can be one of the following values:
|
args (tuple) | An optional tuple of args to pass to the callback. |
kwargs (dict) | An optional dict of kwargs to pass to the callback. |
type ("primary", "secondary", or "tertiary") | An optional string that specifies the button type. This can be one of the following:
|
icon (str or None) | An optional emoji or icon to display next to the button label. If icon is None (default), no icon is displayed. If icon is a string, the following options are valid:
|
disabled (bool) | An optional boolean that disables the download button if set to True. The default is False. |
use_container_width (bool) | Whether to expand the button's width to fill its parent container. If use_container_width is False (default), Streamlit sizes the button to fit its contents. If use_container_width is True, the width of the button matches its parent container. In both cases, if the contents of the button are wider than the parent container, the contents will line wrap. |
Returns | |
(bool) | True if the button was clicked on the last run of the app, False otherwise. |
Examples
Example 1: Download a dataframe as a CSV file
When working with a large dataframe, it's recommended to fetch your data with a cached function. When working with a download button, it's similarly recommended to convert your data into a downloadable format with a cached function. Caching ensures that the app reruns effeciently.
Example 2: Download a string as a text file
You can pass a string to the data argument and Streamlit will automatically use the "text/plain" MIME type.
When you have a widget (like a text area) affecting the value of your download, it's recommended to use another button to prepare the download. In this case, use on_click="ignore" in your download button to prevent the download button from rerunning your app. This turns the download button into a frontend-only element that can be nested in another button.
Without a preparation button, a user can type something into the text area and immediately click the download button. Because a download is initiated concurrently with the app rerun, this can create a race-like condition where the user doesn't see the updated data in their download.
Important
Even when you prevent your download button from triggering a rerun, another widget with a pending change can still trigger a rerun. For example, if a text area has a pending change when a user clicks a download button, the text area will trigger a rerun.
Example 3: Download a file
Use a context manager to open and read a local file on your Streamlit server. Pass the io.BufferedReader object directly to data. Remember to specify the MIME type if you don't want the default type of "application/octet-stream" for generic binary data. In the example below, the MIME type is set to "image/png" for a PNG file.
Still have questions?
Our forums are full of helpful information and Streamlit experts.