跳到主要内容

文件选择器

一个控件,允许您使用本机文件浏览器选择单个或多个文件,并支持扩展名过滤和上传。

信息

在 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 - 文件的完整路径。仅适用于桌面和移动平台。在网络上为 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
  • methodPUT(默认),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.01.0
  • error - 上传过程中发生的错误信息。