跳到主要内容

文件选择器 - FilePicker

一个控件,允许您使用原生文件资源管理器选择单个或多个文件,支持文件类型筛选并支持上传。

信息

在 Linux 系统上,Flet 在作为应用运行时依赖 Zenity。这在通过浏览器运行 Flet 时不是必需的。

要在 Ubuntu/Debian 上安装 Zenity,请运行以下命令:

sudo apt-get install zenity

示例

在线示例

选择多个文件

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 - VIDEOIMAGE
  • AUDIO
  • CUSTOM - 仅包含扩展名在 allowed_extensions 列表中的文件

initial_directory

可以选择在 Linux、macOS 和 Windows 上设置一个绝对路径以指定对话框的初始打开位置。

result

当对话框关闭时会设置结果。

此属性的值是 FilePickerResultEvent 类的一个实例:

  • path - "保存文件"或"获取目录路径"对话框的结果:所选文件的路径或目录的路径。如果对话框被取消,则为 None
  • files - "选择文件"对话框的结果:一个 FilePickerFile 类实例的列表。如果对话框被取消,则为 None

FilePickerFile 类的属性:

  • name - 文件名不包含路径。
  • path - 文件的完整路径。仅适用于桌面和移动平台。在 Web 上为 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 打开该 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") 打开该 URL。

ft.ElevatedButton("Download myfile", on_click=lambda _: page.launch_url("/download/myfile.txt"))

:::

upload()

将所选文件上传到指定的上传 URL。

在调用 upload 之前必须调用 pick_files() 方法,以确保内部文件选择器的选择不为空。

方法参数:

  • files - 一个 FilePickerUploadFile 类实例的列表。

列表中的每个项指定应将文件使用 PUT(默认)或 POST 方法上传到上传 URL。

  • name
  • upload_url
  • method (PUT(默认),POST)

upload_url 通常是一个预签名 URL(如Amazon S3 对象上传 URL)。

对于内置的上传存储,可以使用以下调用生成签名的上传 URL:

upload_url = page.get_upload_url("dir/filename.ext", 60)

第一个参数是相对于上传存储路径的路径。 第二个参数是 URL 的有效期限,以秒为单位。

要启用内置的上传存储,请将 upload_dir 参数提供给 flet.app() 方法的调用:

ft.app(target=main, upload_dir="uploads")

事件

on_result

当文件选择对话框关闭时触发。

事件对象是 FilePickerResultEvent 类的一个实例。请参阅 FilePicker.result 获取类属性。

on_upload

当文件上传进度更新时触发。

事件对象是 FilePickerUploadEvent 类的一个实例:

  • file_name
  • progress - 一个从 0.01.0 的数值。
  • error