『玩转Streamlit』–上传下载文件

Web应用中,文件的上传下载 是交互中不可缺少的功能。

因为在业务功能中,一般不会只有文字的交互,资料或图片的获取和分发是很常见的需求。

比如,文件上传 可让用户向服务器提交数据,如上传图片分享生活、提交文档用于工作协作等,丰富应用功能。

文件下载 则使用户能获取服务器端的资源,像下载软件、报告等,提升用户对应用内容的获取能力,增强用户体验和应用实用性。

本篇介绍如何在Streamlit应用中实现文件的上传下载 功能。

1. 上传 st.file_uploader

Streamlit通过st.file_uploader可以很方便的实现文件上传功能。

st.file_uploader实现文件上传时,包括以下的功能:

  1. 本地文件选择:创建一个文件上传组件,然后用户可通过该组件选择本地文件进行上传
  2. 限制文件类型:可以指定允许上传的文件扩展名
  3. 支持多文件上传:能够同时选择并上传多个文件

它的主要参数有:

名称 类型 说明
label str 解释文件上传用途的简短标签
type [str] 允许上传的文件扩展名数组
accept_multiple_files bool 是否允许同时上传多个文件
key str 组件的唯一标识
help str 上传文件的提示信息
on_change func 文件上传时的回调函数
args tuple 传递给回调函数的可选参数元组
kwargs dict 传递给回调函数的可选参数字典
label_visibility str 标签的可见性

注意,label_visibility参数是配合label一起使用的,label_visibility只有3种值:

  1. visible:这是默认值,表示正常显示label
  2. hidden:显示空占位符
  3. collapsed:不显示标签或占位符

label参数也支持一些markdown格式,可以让标签内容显示的更加丰富。

下面通过一些示例来演示上传的使用方法:

1.1. 基本使用

在这个示例中,st.file_uploader函数创建了一个文件上传组件,标签为 “选择文件 ”。

当用户选择并上传文件后,应用程序会显示上传文件的文件名。

```python
import streamlit as st

uploaded_file = st.file_uploader("选择文件:")
if uploaded_file is not None:
    st.write(uploaded_file.name)
```

『玩转Streamlit』--上传下载文件

1.2. 上传限制

默认情况下,Streamlit 允许上传的文件大小限制为 200MB

如果需要修改这个限制,可以通过配置server.maxUploadSize选项来实现。

例如,要将上传文件大小限制设置为 500MB,可以在Streamlit的配置文件config.toml文件中添加以下配置:

```toml
[server]
maxUploadSize = 500
```

1.3. 允许的文件类型

通过type参数指定允许上传的文件类型。

例如,只允许上传图片文件(pngjpg 格式),可以这样使用:

```python
import streamlit as st

uploaded_file = st.file_uploader("选择图片文件", type=["png", "jpg"])
```

1.4. 上传多个文件

如果需要允许用户上传多个文件 ,可以将accept_multiple_files参数设置为True

示例如下:

```python
import streamlit as st

uploaded_files = st.file_uploader("选择多个文件:", accept_multiple_files=True)
for uploaded_file in uploaded_files:
    st.write(uploaded_file.name)
```

1.5. 文件上传后的回调

上传文件后,可以对文件进行各种处理。

例如,可以读取文件内容、将文件保存到本地、使用文件数据进行计算等。

以下是一个读取上传的 CSV 文件并显示数据的示例:

```python
import streamlit as st
import pandas as pd

uploaded_file = st.file_uploader("选择 CSV 文件:")
if uploaded_file is not None:
    dataframe = pd.read_csv(uploaded_file)
    st.write(dataframe)
```

2. 下载 st.download_button

Streamlit中一般使用st.download_button来实现文件下载功能。

当用户点击下载按钮时,可以将指定的文件内容下载到本地设备。

这一功能在许多场景中都非常实用,比如让用户下载数据报表、图片、文档等。

st.download_button的主要参数有:

名称 类型 说明
label str 解释文件下载用途的简短标签
data str / bytes / file 要下载文件的内容
file_name str 指定下载文件的名称,若未指定则自动生成
mime str 数据的 MIME 类型
key str 组件的唯一标识
help str 下载文件的提示信息
on_click func 按钮点击时的回调函数
args tuple 传递给回调函数的可选参数元组
kwargs dict 传递给回调函数的可选参数字典
type str 指定按钮类型
icon str 按钮标签旁显示的表情符号或图标

注意,type参数只有3种类型:

  1. primary:背景为应用主色强调
  2. secondary:与背景协调
  3. tertiary:无框无背景纯文本

下面通过一些示例来演示下载的使用方法:

2.1. 基本使用

下面是一个简单的示例,展示如何使用st.download_button下载一个字符串内容的文件。

```python
import streamlit as st

text_contents = "这是一段用来下载的文字。"
st.download_button("下载文本文件:", text_contents)
```

2.2. 下载 CSV 文件

这个示例中,我们先将DataFrame转换为 CSV 格式的字节数据,然后通过st.download_button提供下载。

```python
import streamlit as st
import pandas as pd

@st.cache_data
def convert_df(df):
    # 缓存转换结果,避免每次重新计算
    return df.to_csv()


df = pd.DataFrame({"col1": [1, 2, 3], "col2": ["a", "b", "c"]})
csv_data = convert_df(df)

st.download_button(
    label="下载 CSV",
    data=csv_data,
    file_name="data.csv",
    mime="text/csv",
)
```

2.3. 下载图片文件

这个示例中,我们打开一个图片文件,以二进制读取模式读取文件内容,并将其作为data参数传递给下载按钮。

```python
import streamlit as st

with open("image.jpg", "rb") as file:
    btn = st.download_button(
        label="下载图片",
        data=file,
        file_name="image.jpg",
        mime="image/jpeg"
    )
```

3. 总结

总的来说,Streamlit中的st.file_uploaderst.download_button组件是实现文件交互的关键工具。

使用st.file_uploader时要注意上传大小限制,合理设置标签与键值,处理好文件类型及多文件上传情况。

对于st.download_button,需留意内存占用,准确设置文件内容、名称与MIME类型,考虑按钮样式及回调函数,同时防止应用意外重新运行。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4921.html

(0)
LomuLomu
上一篇 2024 年 12 月 30 日 下午12:54
下一篇 2024 年 12 月 30 日 下午3:28

相关推荐

  • 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。 好了,接下来我们就开始深入了解这个话题。 模型对接 我们首先需要…

    2025 年 1 月 11 日
    61100
  • 深入解析Java中的JSONObject操作指南

    文章大纲 Java中JSONObject的全面解析 第一部分:概述 第二部分:JSONObject的基础应用 1、初始化JSONObject 2、数据插入方法 3、数值提取技巧 第三部分:JSONObject进阶功能 1、对象遍历实现 2、字符串转换JSON 3、JSONArray协同操作 4、数据修改与移除 第四部分:异常处理机制 1. 键值验证 2. 安…

    2025 年 5 月 19 日
    66200
  • 用 Cursor 写出第一个程序

    大家好,我是汤师爷 最近几个月,Cursor迅速走红,成为一款强大的编程助手。Cursor不仅使用简单,而且通过集成各种大模型技术,编程能力一流。 Cursor是什么? Cursor是一个类似VSCode的编辑器,集成了GPT-4、Claude 3.5等LLM模型。它本质上是在VSCode的基础上添加了AI辅助编程功能。 从界面布局到操作方式都与VSCode…

    2025 年 1 月 1 日
    82900
  • 架构-初识BFF

    引言 晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。 除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。 这是我的架构第一课,听得有些似懂非懂,于是浅浅地整理一下。 BFF 是什么 BFF是服务于前端的后端,全称Backend For Frontend。B…

    2024 年 12 月 30 日
    45100
  • vue3 + pnpm 打造一个 monorepo 项目

    单一仓库与多仓库架构 单一仓库(Monorepo)架构是一种策略,它允许我们在一个单一的仓库中管理多个项目或包;而多仓库(Multirepo)架构则是将每个项目分别存放在不同的仓库中。 在Monorepo结构中,除了根目录下有一个公共的package.json文件外,每个子项目(sub-package)也有自己的package.json文件。 子项目之间可以…

    未分类 2024 年 12 月 24 日
    47800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信