# taken from https://gist.github.com/benlansdell/44000c264d1b373c77497c0ea73f0ef2 # slightly modified """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): global i_will_regret_this, i_will_regret_this2 choice = st.session_state[key] if os.path.isdir(os.path.join(st.session_state[key + "curr_dir"], choice)): st.session_state[key + "index"] = 0 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"])) files.insert(0, "..") files.insert(0, ".") 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, "..") files.insert(0, ".") st.session_state[key + "files"] = files st.session_state[key + "curr_dir"] = base_path st.session_state[key + "index"] = ( st.session_state[key + "files"].index(os.path.basename(path)) if os.path.isfile(path) and path[-4:] == '.pth' else 0 ) else: base_path = st.session_state[key + "curr_dir"] selected_file = st_placeholder.selectbox( label=label, options=st.session_state[key + "files"], index=st.session_state[key + "index"], key=key, on_change=lambda: update_dir(key), ) selected_path = os.path.normpath(os.path.join(base_path, selected_file)) st_placeholder.write(os.path.abspath(selected_path)) return selected_path