文件选择器
一个控件,允许您使用本机文件浏览器选择单个或多个文件,并支持扩展名过滤和上传。
在 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
,默认值为FilePickerFileType.ANY
.
initial_directory
可以选择设置为绝对路径,以指定对话框应在其中打开的位置。仅支持 Linux、macOS 和 Windows。
result
在对话框关闭时设置结果。
此属性的值是 FilePickerResultEvent
。
方法
get_directory_path()
选择目录并返回其绝对路径。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
- 对话框窗口的标题。initial_directory
- 对话框应打开的初始目录。
pick_files()
从底层平台检索文件。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
- 对话框窗口的标题。initial_directory
- 对话框应打开的初始目录。file_type
- 允许的FilePickerFileType
。allowed_extensions
- 允许的文件扩展名。仅当file_type
为FilePickerFileType.CUSTOM
时有效。allow_multiple
- 允许选择多个文件。
save_file()
打开“保存文件”对话框,让用户选择文件路径和文件名以保存文件。
此函数实际上并不保存文件。它只是打开对话框,让用户选择位置和文件名。此函数仅在桌面平台(Linux、macOS 和 Windows)上可用。
您可以设置以下文件选择器属性,也可以在方法调用中提供它们的值:
dialog_title
- 对话框窗口的标题。file_name
- 默认文件名。initial_directory
- 对话框应打开的初始目录。file_type
- 允许的FilePickerFileType
。allowed_extensions
- 允许的文件扩展名。仅在file_type
为FilePickerFileType.CUSTOM
时有效。
要从网络保存文件,您不需要使用 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
.