Uploading multiple files with file uploader

Good job with the st.file_uploader(). I spent some time playing with it but could not figure out how to upload multiple files.

In my case I would like the user to upload multiple images (in a batch or one-by-one), and then run an ML model on them. Is this somehow possible with the current release?

I tried but it turns out that I cannot easily use the file_uploader.

  • You can only upload one file at the time.
  • You get no additional information on the file like name, size, upload time, type etc. So you cannot distinguish the files without reading the content.
  • every time you interact with any widget, the script is rerun and you risk processing or storing the file again!
  • The file uploader widget is not cleared when you clear the cache and there is no way to clear the file uploader widget programmatically.

But here is something that feels like multiple file upload.

I will be adding it to the gallery at awesome-streamlit.org.

# pylint: disable=line-too-long
"""This is example shows how to **upload multiple files** via the
[File Uploader Widget](https://streamlit.io/docs/api.html?highlight=file%20upload#streamlit.file_uploader)

As far as I can see you can only upload one file at a time. So if you need multiple files in your
app, you need to store them in a static List or Dictionary. Alternatively they should be uploaded
as one .zip file.

Please note that file uploader is a **bit problematic** because
- You can only upload one file at the time.
- You get no additional information on the file like name, size, upload time, type etc. So you
cannot distinguish the files without reading the content.
- every time you interact with any widget, the script is rerun and you risk processing or storing
the file again!
- The file uploader widget is not cleared when you clear the cache and there is no way to clear the
file uploader widget programmatically.

Based on the above list I created [Issue 897](https://github.com/streamlit/streamlit/issues/897)

This example was based on
[Discuss 1445](https://discuss.streamlit.io/t/uploading-multiple-files-with-file-uploader/1445)
"""
# pylint: enable=line-too-long
from typing import Dict

import streamlit as st


@st.cache(allow_output_mutation=True)
def get_static_store() -> Dict:
    """This dictionary is initialized once and can be used to store the files uploaded"""
    return {}


def main():
    """Run this function to run the app"""
    static_store = get_static_store()

    st.info(__doc__)
    result = st.file_uploader("Upload", type="py")
    if result:
        # Process you file here
        value = result.getvalue()

        # And add it to the static_store if not already in
        if not value in static_store.values():
            static_store[result] = value
    else:
        static_store.clear()  # Hack to clear list if the user clears the cache and reloads the page
        st.info("Upload one or more `.py` files.")

    if st.button("Clear file list"):
        static_store.clear()
    if st.checkbox("Show file list?", True):
        st.write(list(static_store.keys()))
    if st.checkbox("Show content of files?"):
        for value in static_store.values():
            st.code(value)


main()
4 Likes

@Marc

Can you provide example of uploading files using multiple st.file_uploader.

For instance, lets say I want to upload 5 files and I want to do it one by one. If I click a button once, it should display a st.file_uploader. Similary it keeps on displaying st.file_uploader and allows to add files whenever I click the add button.

@ifeherva Can you able to find a solution?

Thank you! I will try this out.

1 Like