如何通过Streamlit Web应用直接与S3 Bucket进行文件交互(读/写/删)
解决Streamlit上传文件到S3失败的问题
一、先排查核心配置问题
- 确认AWS凭证配置:本地开发可使用
~/.aws/credentials文件,或通过Streamlit的st.secrets注入AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,禁止硬编码密钥到代码中。 - 检查S3 Bucket权限:确保AWS用户拥有
s3:PutObject、s3:GetObject、s3:ListBucket、s3:DeleteObject权限,Bucket策略无上传限制规则。 - 核对Bucket名称与区域:Bucket名称全局唯一,代码中配置的区域需与Bucket实际区域一致(如
us-east-1、ap-southeast-1)。
二、完整可运行代码示例
以下代码包含上传、读取、删除S3文件的交互功能,替换your-bucket-name-here为你的Bucket名称即可使用:
import streamlit as st import boto3 from botocore.exceptions import ClientError # 初始化S3客户端 def get_s3_client(): # 优先使用Streamlit Secrets(推荐) if "AWS_ACCESS_KEY_ID" in st.secrets and "AWS_SECRET_ACCESS_KEY" in st.secrets: return boto3.client( "s3", aws_access_key_id=st.secrets["AWS_ACCESS_KEY_ID"], aws_secret_access_key=st.secrets["AWS_SECRET_ACCESS_KEY"], region_name=st.secrets.get("AWS_REGION", "us-east-1") ) # 本地开发用环境变量或默认凭证链 else: return boto3.client("s3") s3 = get_s3_client() BUCKET_NAME = "your-bucket-name-here" st.title("S3 文件管理器") # 上传文件模块 st.subheader("上传文件到S3") uploaded_file = st.file_uploader("选择文件", type=None) if uploaded_file is not None: try: s3.put_object( Bucket=BUCKET_NAME, Key=uploaded_file.name, Body=uploaded_file.getvalue() ) st.success(f"文件 {uploaded_file.name} 上传成功!") except ClientError as e: st.error(f"上传失败: {e.response['Error']['Message']}") # 文件管理模块 st.subheader("管理S3中的文件") try: response = s3.list_objects_v2(Bucket=BUCKET_NAME) if "Contents" in response: file_names = [obj["Key"] for obj in response["Contents"]] selected_file = st.selectbox("选择要操作的文件", file_names) col1, col2 = st.columns(2) with col1: if st.button("查看文件内容"): try: file_obj = s3.get_object(Bucket=BUCKET_NAME, Key=selected_file) content = file_obj["Body"].read().decode("utf-8") st.text_area("文件内容", content, height=300) except ClientError as e: st.error(f"读取失败: {e.response['Error']['Message']}") with col2: if st.button("删除文件", type="primary"): try: s3.delete_object(Bucket=BUCKET_NAME, Key=selected_file) st.success(f"文件 {selected_file} 删除成功!") st.rerun() except ClientError as e: st.error(f"删除失败: {e.response['Error']['Message']}") else: st.info("Bucket中暂无文件") except ClientError as e: st.error(f"获取文件列表失败: {e.response['Error']['Message']}")
三、关键注意事项
- 安全存储凭证:Streamlit Cloud部署时,通过Secrets管理添加凭证配置;本地开发可创建
.streamlit/secrets.toml文件,格式如下:AWS_ACCESS_KEY_ID = "你的访问密钥" AWS_SECRET_ACCESS_KEY = "你的秘密密钥" AWS_REGION = "你的Bucket区域" - 文件大小限制:Streamlit默认限制上传文件200MB,如需更大文件,启动时添加参数:
streamlit run app.py --server.maxUploadSize=1024(单位MB)。 - 错误排查:通过捕获
ClientError获取具体错误信息,快速定位权限不足、Bucket不存在等问题。
内容的提问来源于stack exchange,提问作者Laster
相关产品推荐
相关产品推荐

