使用Streamlit与LangChain开发聊天机器人时文件上传报错求助
问题分析与解决方案
你的错误核心有两个:一是可能缺少PyPDFLoader的依赖库,二是没有正确处理Streamlit上传的文件对象(直接传给了需要本地路径的PyPDFLoader)。
第一步:安装依赖库
PyPDFLoader依赖pypdf库,先确保已安装:
pip install pypdf langchain_community streamlit
第二步:修改代码处理上传文件
Streamlit的file_uploader返回的是UploadedFile对象(多文件时为列表),无法直接作为路径传入PyPDFLoader,需要先将文件保存到本地临时路径,再使用路径加载。修改后的完整代码如下:
import os import tempfile import streamlit as st from langchain_community.document_loaders import PyPDFLoader def load_pdf(file_path): """Load a PDF file and split it into pages.""" pdf_loader = PyPDFLoader(file_path) pages = pdf_loader.load_and_split() return pages with st.sidebar: st.title("Menú:") pdf_docs = st.file_uploader("Cargue los documentos", accept_multiple_files=True) if st.button("Submit and Process", key="process_button"): if not pdf_docs: st.error("Por favor cargue al menos un documento PDF") else: with st.spinner("Procesando..."): all_pages = [] # 遍历处理每个上传的PDF for uploaded_file in pdf_docs: # 创建临时文件保存上传内容 with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file: tmp_file.write(uploaded_file.getvalue()) tmp_path = tmp_file.name # 加载PDF页面 pages = load_pdf(tmp_path) all_pages.extend(pages) # 清理临时文件(可选) os.unlink(tmp_path) # 后续可使用all_pages做向量库存储等操作 st.success(f"Procesado exitosamente! Se cargaron {len(all_pages)} páginas de {len(pdf_docs)} documentos.")
关键修复点
- 用
tempfile.NamedTemporaryFile将上传文件写入本地临时路径,获取合法的文件路径传给PyPDFLoader - 支持多文件上传,遍历每个文件并合并加载结果
- 添加空文件校验,避免无文件时触发错误
- 可选的临时文件清理步骤,避免占用服务器空间
内容的提问来源于stack exchange,提问作者Angel Panda
相关产品推荐
相关产品推荐

