针对 Streamlit 1.58 可以隐藏文件上传列表的解决方案
# 在创建文件上传组件后立即应用CSS,
- # ===================== 第二列:参数设置 =====================
- with param_col:
- with st.container(border=True, height=820):
- st.markdown("**⚙️ 参数设置**")
- left_col, right_col = st.columns([2, 3])
- # -------- 左侧:图生图 / 文生图 --------
- with left_col:
- with st.container(border=True, height=745):
- tab1, tab2 = st.tabs(["图生图", "文生图"])
- # ===== 图生图 =====
- with tab1:
- # 首先,添加 CSS 样式来隐藏文件列表
- st.markdown("""
- <style>
- /* 隐藏最近创建的文件上传组件的文件列表 */
- div[data-testid="stFileUploader"]:has(input[type="file"]) > div:last-child {
- display: none !important;
- }
- </style>
- """, unsafe_allow_html=True)
- # ⭐ 底图上传控件
- base_file = st.file_uploader(
- "产品图上传",
- type=["png", "jpg", "jpeg", "webp", "bmp", "tiff"],
- key="hidden_base",
- label_visibility="visible",
- help="推荐PNG,JPG,JPEG,不推荐webp,gif",
-
- )
- # ⭐ 保存到 session_state
- if base_file:
- st.session_state.base_image = base_file
- # ⭐ 上传后显示底图,宽度固定100px,点击放大
- if st.session_state.base_image:
- img_bytes = st.session_state.base_image.getvalue()
- img_base64 = base64.b64encode(img_bytes).decode()
- st.markdown(f"""
- <img
- src="data:image/png;base64,{img_base64}"
- style="width:100px; object-fit:contain; cursor:pointer;"
- onclick="showPreview(this.src)"
- />
- """, unsafe_allow_html=True)
- # ⭐ 删除底图按钮(兼容新旧版本)
- if st.button("删除底图", key="del_base"):
- st.session_state.base_image = None
- # 适配 Streamlit 版本:1.28+ 用 st.rerun(),低版本用 st.experimental_rerun()
- try:
- st.rerun()
- except AttributeError:
- st.experimental_rerun()
- st.divider()
- # ===== 参考图上传=====
- ref_files = st.file_uploader(
- "参考图上传",
- type=["png", "jpg", "jpeg", "webp", "bmp", "tiff"],
- accept_multiple_files=True,
- key="ref_uploader",
- label_visibility="visible",
- help="推荐PNG,JPG,JPEG,不推荐webp,gif"
- )
-
- # ⭐ 处理参考图上传(去重 + 限制数量)
- if ref_files:
- for f in ref_files:
- if len(st.session_state.ref_images) >= 9:
- st.warning("最多只能上传9张参考图!")
- break
- # 文件去重(MD5哈希)
- file_hash = hashlib.md5(f.getvalue()).hexdigest()
- exists = any(x.get("hash") == file_hash for x in st.session_state.ref_images)
- if not exists:
- st.session_state.ref_images.append({
- "id": str(uuid.uuid4()),
- "file": f,
- "hash": file_hash
- })
- # ⭐ 参考图缩略图显示 + 删除逻辑(每行3张)
- if st.session_state.ref_images:
- cols = st.columns(3)
- delete_id = None
- clear_all = False
- for idx, img in enumerate(st.session_state.ref_images):
- with cols[idx % 3]:
- # 生成图片Base64
- img_base64 = base64.b64encode(img["file"].getvalue()).decode()
- # 显示图片(点击放大)
- st.markdown(f"""
- <img
- src="data:image/png;base64,{img_base64}"
- style="width:120px; max-height:160px; object-fit:contain; cursor:pointer;"
- onclick="showPreview(this.src)"
- />
- """, unsafe_allow_html=True)
- # 单个删除按钮(唯一key)
- if st.button("🗑 删除", key=f"del_ref_{img['id']}", use_container_width=True):
- delete_id = img["id"]
- # 清空所有参考图按钮
- if st.button("清空所有参考图", key="clear_all_ref", use_container_width=True):
- clear_all = True
- # ⭐ 执行删除/清空操作(立即刷新)
- if delete_id or clear_all:
- if clear_all:
- st.session_state.ref_images.clear()
- else:
- st.session_state.ref_images = [x for x in st.session_state.ref_images if x["id"] != delete_id]
- # 适配 Streamlit 版本
- try:
- st.rerun()
- except AttributeError:
- st.experimental_rerun()
复制代码
|