"""FilePicker for streamlit. Still doesn't seem to be a good solution for a way to select files to process from the server Streamlit is running on. Here's a pretty functional solution. Usage: ``` import streamlit as st from filepicker import st_file_selector tif_file = st_file_selector(st, key = 'tif', label = 'Choose tif file') ``` """ import os import streamlit as st def update_dir(key): choice = st.session_state[key] if os.path.isdir(os.path.join(st.session_state[key+'curr_dir'], choice)): st.session_state[key+'curr_dir'] = os.path.normpath(os.path.join(st.session_state[key+'curr_dir'], choice)) files = sorted(os.listdir(st.session_state[key+'curr_dir'])) if "images" in files: files.remove("images") st.session_state[key+'files'] = files def st_file_selector(st_placeholder, path='.', label='Select a file/folder', key = 'selected'): if key+'curr_dir' not in st.session_state: base_path = '.' if path is None or path == '' else path base_path = base_path if os.path.isdir(base_path) else os.path.dirname(base_path) base_path = '.' if base_path is None or base_path == '' else base_path files = sorted(os.listdir(base_path)) files.insert(0, 'Choose a file...') if "images" in files: files.remove("images") st.session_state[key+'files'] = files st.session_state[key+'curr_dir'] = base_path else: base_path = st.session_state[key+'curr_dir'] selected_file = st_placeholder.selectbox(label=label, options=st.session_state[key+'files'], key=key, on_change = lambda: update_dir(key)) if selected_file == "Choose a file...": return None return selected_file