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函数创建了一个文件上传组件,标签为 “选择文件”。

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

import streamlit as st

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

1.2. 上传限制

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

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

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

[server]
maxUploadSize = 500

1.3. 允许的文件类型

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

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

import streamlit as st

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

1.4. 上传多个文件

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

示例如下:

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 文件并显示数据的示例:

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下载一个字符串内容的文件。

import streamlit as st

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

2.2. 下载 CSV 文件

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

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参数传递给下载按钮。

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类型,考虑按钮样式及回调函数,同时防止应用意外重新运行。

『玩转Streamlit』--上传下载文件的更多相关文章

  1. rz和sz上传下载文件工具lrzsz

    ######################### rz和sz上传下载文件工具lrzsz ####################################################### ...

  2. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

  3. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  4. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  5. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  6. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  7. HttpClient上传下载文件

    HttpClient上传下载文件 java HttpClient Maven依赖 <dependency> <groupId>org.apache.httpcomponents ...

  8. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

  9. 如何利用京东云的对象存储(OSS)上传下载文件

    作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...

  10. SFTP上传下载文件、文件夹常用操作

    SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...

随机推荐

  1. vue3 + vite 分析报告 report == rollup-plugin-visualizer

    安装插件 npm i rollup-plugin-visualizer -D 配置vite.config.js 文件 [加入插件] import { defineConfig } from 'vite ...

  2. 02 Transformer 中 Add&Norm (残差和标准化)代码实现

    python/pytorch 基础 https://www.cnblogs.com/nickchen121 培训机构(Django 类似于 Transformers) 首先由一个 norm 函数 no ...

  3. Awesome-Visual-Captioning

    目录 Table of Contents Paper Roadmap ACL-2021 CVPR-2021 AAAI-2021 ACMMM-2020 NeurIPS-2020 ECCV-2020 Vi ...

  4. 0602-nn.Module

    0602-nn.Module 目录 一.nn.Module 1.1 构建一层网络--全连接层 1.2 构建多层网络--多层感知机 pytorch完整教程目录:https://www.cnblogs.c ...

  5. Android复习(四)权限—>请求应用权限

    每款 Android 应用都在访问受限的沙盒中运行.如果应用需要使用其自己的沙盒外的资源或信息,则必须请求相应权限. 要声明您的应用需要某项权限,您可以在应用清单中列出该权限,然后在运行时请求用户批准 ...

  6. 【VMware VCF】更新 VCF 5.1 至 VCF 5.2 版本。

    VMware Cloud Foundation(VCF)是一个由众多产品(vSphere.vSAN 以及 NSX 等)所构成的 SDDC 解决方案,这些环境中的不同组件的生命周期统一由 SDDC Ma ...

  7. ARM 版 Kylin V10 部署 KubeSphere 3.4.0 不完全指南

    前言 知识点 定级:入门级 KubeKey 安装部署 ARM 版 KubeSphere 和 Kubernetes ARM 版麒麟 V10 安装部署 KubeSphere 和 Kubernetes 常见 ...

  8. KubeSphere 3.3.2 版本正式发布!

    距离上一个版本 v3.3.1 发布,已经过了 3 个多月,今天我们很高兴宣布 KubeSphere v3.3.2 正式发布! 此版本由 68 位贡献者参与代码提交,感谢各位贡献者对 KubeSpher ...

  9. 循环程序结构设计(python)

    文章目录 1.基本概念 2.for循环 2.1 for循环基本结构 2.2 实例介绍 2.2.1 循环输出字符 2.2.2循环输出2000以内的素数 3.whlie循环 3.1 while循环基本结构 ...

  10. 安装了多个python版本指定pip安装目录

    #检查库安装的目录import os import numpy as np import pandas as pd print(os.path.dirname(np.__file__)) print( ...