You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:03:18