文件选择器
一个控件,允许您使用本机文件浏览器选择单个或多个文件,并支持扩展名过滤和上传。
在 Linux 上,当作为应用程序运行 Flet 时,文件选择器控件依赖于 Zenity。在浏览器中运行 Flet 时不需要这个依赖。
要在 Ubuntu/Debian 上安装 Zenity,请运行以下命令:
sudo apt-get install zenity
示例
选择多个文件
- Python
import flet as ft
def main(page: ft.Page):
def pick_files_result(e: ft.FilePickerResultEvent):
selected_files.value = (
", ".join(map(lambda f: f.name, e.files)) if e.files else "已取消!"
)
selected_files.update()
pick_files_dialog = ft.FilePicker(on_result=pick_files_result)
selected_files = ft.Text()
page.overlay.append(pick_files_dialog)
page.add(
ft.Row(
[
ft.ElevatedButton(
"选择文件",
icon=ft.icons.UPLOAD_FILE,
on_click=lambda _: pick_files_dialog.pick_files(
allow_multiple=True
),
),
selected_files,
]
)
)
ft.app(target=main)
所有对话框模式
上传多个文件
属性
allowed_extensions
仅允许选择指定扩展名的文件。
此属性的值是一个字符串列表,例如 ["pdf", "svg", "jpg"]
。
allow_multiple
允许选择多个文件。
dialog_title
可以选择在桌面平台上设置模态窗口的标题。在其他平台上将被忽略。
file_name
仅对“保存文件”对话框有效。可以设置为非空字符串以提供默认文件名。
file_type
允许选择特定组的文件。
属性值是 FilePickerFileType
枚举,具有以下值:
ANY
(默认)- 任意文件IMAGE
VIDEO
MEDIA
-VIDEO
和IMAGE
AUDIO
CUSTOM
- 仅具有allowed_extensions
列表中扩展名的文件
initial_directory
可以选择设置为绝对路径,以指定对话框应在其中打开的位置。仅支持 Linux、macOS 和 Windows。
result
在对话框关闭时设置结果。
此属性的值是 FilePickerResultEvent
类的实例:
path
- “保存文件”或“获取目录路径”对话框的结果:所选文件路径或目录路径,分别。如果对话框被取消,则为None
。files
- “选择文件”对话框的结果:FilePickerFile
类实例的列表。如果对话框被取消,则为None
。
FilePickerFile
类的属性:
name
- 不带路径的文件名。path
- 文件的完整路径。仅适用于桌面和移动平台。在网络上为None
。size
- 文件大小(以字节为单位)。
方法
get_directory_path()
选择目录并返回其绝 对路径。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
initial_directory
pick_files()
从底层平台检索文件。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
initial_directory
file_type
allowed_extensions
allow_multiple
save_file()
打开“保存文件”对话框,让用户选择文件路径和文件名以保存文件。
此函数实际上并不保存文件。它只是打开对话框,让用户选择位置和文件名。此函数仅在桌面平台(Linux、macOS 和 Windows)上可用。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
file_name
initial_directory
file_type
allowed_extensions
要从网络保存文件,您不需要 使用 FilePicker 对象。
您可以提供一个返回文件内容的 API 端点 /download/:filename
,然后使用 page.launch_url
打开该网址,这将触发浏览器的保存文件对话框。
以 FastAPI 为例,您可以使用以下代码实现端点:
from fastapi import FastAPI, Response
from fastapi.responses import FileResponse
app = flet_fastapi.app(main)
@app.get("/download/{filename}")
def download(filename: str):
path = prepare_file(filename)
return FileResponse(path)
然后使用 page.launch_url("/download/myfile.txt")
打开该网址,例如,当单击按钮时。
ft.ElevatedButton("下载 myfile", on_click=lambda _: page.launch_url("/download/myfile.txt"))
upload()
将选定的文件上传到指定的上传 URL。
在调用 upload 之前必须调用 pick_files()
,以便内部文件选择器选择不为空。
方法参数:
files
-FilePickerUploadFile
类实例的列表。
每个列表
项指定应上传到上传 URL 的文件,使用 PUT
(默认)或 POST
方法。
name
upload_url
method
(PUT
(默认),POST
)
upload_url
通常是预签名 URL(如 AWS S3 对象上传 URL)。
对于内置上传存储,可以使用以 下调用生成已签名的上传 URL:
upload_url = page.get_upload_url("dir/filename.ext", 60)
第一个参数是相对于上传存储路径的路径。 第二个参数是 URL 的生存时间(以秒为单位)。
要启用内置上传存储,请在 flet.app()
调用中提供 upload_dir
参数:
ft.app(target=main, upload_dir="uploads")
事件
on_result
当文件选择器对话框关闭时触发。
事件对象是 FilePickerResultEvent
类的实例。请参阅 FilePicker.result
查看类属性。
on_upload
在文件上传进度更新时触发。
事件对象是 FilePickerUploadEvent
类的实例:
file_name
- 上传的文件名。progress
- 上传进度,从0.0
到1.0
。error
- 上传过程中发生的错误信息。