Flutter文件选择插件file_picker_fork的使用

Flutter文件选择插件file_picker_fork的使用

fluter_file_picker

File Picker #

这是一个允许你使用原生文件浏览器选择单个或多个文件的包,并支持扩展名过滤。

目前支持的功能 #

  • 使用操作系统默认的原生选择器
  • 支持多种平台(移动设备、网页、桌面和Flutter GO)
  • 使用自定义格式过滤选择文件——你可以提供一个文件扩展名列表(如pdf、svg、zip等)
  • 从云文件中选择文件(如GDrive、Dropbox、iCloud)
  • 单个或多个文件选择
  • 不同的默认类型过滤(媒体、图像、视频、音频或任何类型)
  • 选择目录
  • 如果需要,可以立即将文件数据加载到内存中(Uint8List
  • 打开保存文件/另存为对话框(让用户指定文件保存的位置、目录和名称)

如果你有任何希望在这个包中看到的功能,请随时提出建议。🎉

兼容性图表 #

API Android iOS Linux macOS Windows Web
clearTemporaryFiles()
getDirectoryPath()
pickFiles()
saveFile()

有关详细信息,请参阅 API部分的File Picker Wikipub.dev上的官方API引用

文档 #

有关如何安装、设置和使用的详细信息,请参阅File Picker Wiki

File Picker Wiki #

  1. 安装
  2. 设置
  3. API
  4. 常见问题解答
  5. 故障排除

用法 #

快速简单的使用示例:

单个文件 #

FilePickerResult? result = await FilePicker.platform.pickFiles();

if (result != null) { File file = File(result.files.single.path); } else { // 用户取消了选择 }

多个文件 #

FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);

if (result != null) { List<File> files = result.paths.map((path) => File(path)).toList(); } else { // 用户取消了选择 }

带扩展名过滤的多个文件 #

FilePickerResult? result = await FilePicker.platform.pickFiles(
  type: FileType.custom,
  allowedExtensions: ['jpg', 'pdf', 'doc'],
);

选择目录 #

String? selectedDirectory = await FilePicker.platform.getDirectoryPath();

if (selectedDirectory == null) { // 用户取消了选择 }

保存文件/另存为对话框 #

String? outputFile = await FilePicker.platform.saveFile(
  dialogTitle: '请选择输出文件:',
  fileName: 'output-file.pdf',
);

if (outputFile == null) { // 用户取消了选择 }

加载结果和文件详情 #

FilePickerResult? result = await FilePicker.platform.pickFiles();

if (result != null) { PlatformFile file = result.files.first;

print(file.name); // 文件名 print(file.bytes); // 文件字节 print(file.size); // 文件大小 print(file.extension); // 文件扩展名 print(file.path); // 文件路径 } else { // 用户取消了选择 }

使用Flutter Web选择并上传文件到Firebase Storage #

FilePickerResult? result = await FilePicker.platform.pickFiles();

if (result != null) { Uint8List fileBytes = result.files.first.bytes; String fileName = result.files.first.name;

// 上传文件 await FirebaseStorage.instance.ref(‘uploads/$fileName’).putData(fileBytes); }

有关完整的用法细节,请参阅上面的Wiki

示例应用 #

Android #

Demo

iOS #

DemoMultiFilters

MacOS #

DemoMacOS

Linux #

DemoLinux

Windows #

DemoWindows

开始使用 #

有关如何开始使用Flutter的详细信息,请查看我们的在线 文档

有关如何编辑插件代码的详细信息,请查看 文档

完整示例Demo

以下是一个完整的示例Demo,展示了如何使用file_picker_fork插件选择文件并在控制台中打印文件信息。

import 'package:flutter/material.dart';
import 'package:file_picker_example/src/file_picker_demo.dart';
import 'package:file_picker/file_picker.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('File Picker Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 选择文件
              FilePickerResult? result = await FilePicker.platform.pickFiles();

              if (result != null) {
                // 获取文件信息
                PlatformFile file = result.files.first;

                // 打印文件信息
                print('文件名: ${file.name}');
                print('文件字节: ${file.bytes}');
                print('文件大小: ${file.size}');
                print('文件扩展名: ${file.extension}');
                print('文件路径: ${file.path}');
              } else {
                // 用户取消了选择
                print('用户取消了选择');
              }
            },
            child: Text('选择文件'),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文件选择插件file_picker_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件选择插件file_picker_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


file_picker_forkfile_picker 插件的一个分支,用于在 Flutter 应用中选择文件和目录。它支持多平台(包括 Android、iOS、Web、Linux、macOS 和 Windows),并且允许用户从设备中选择文件、目录或者创建新文件。以下是如何在 Flutter 项目中使用 file_picker_fork 插件的步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 file_picker_fork 依赖:

dependencies:
  flutter:
    sdk: flutter
  file_picker_fork: ^5.0.0 # 请检查最新版本

然后运行 flutter pub get 以安装依赖。

2. 导入插件

在你的 Dart 文件中导入 file_picker_fork

import 'package:file_picker_fork/file_picker_fork.dart';

3. 使用插件选择文件

选择单个文件

void pickFile() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles();

  if (result != null) {
    PlatformFile file = result.files.first;
    print('File name: ${file.name}');
    print('File size: ${file.size}');
    print('File path: ${file.path}');
  } else {
    // 用户取消了文件选择
    print('No file selected.');
  }
}

选择多个文件

void pickMultipleFiles() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);

  if (result != null) {
    List<PlatformFile> files = result.files;
    for (var file in files) {
      print('File name: ${file.name}');
      print('File size: ${file.size}');
      print('File path: ${file.path}');
    }
  } else {
    // 用户取消了文件选择
    print('No files selected.');
  }
}

选择目录

void pickDirectory() async {
  String? selectedDirectory = await FilePicker.platform.getDirectoryPath();

  if (selectedDirectory != null) {
    print('Selected directory: $selectedDirectory');
  } else {
    // 用户取消了目录选择
    print('No directory selected.');
  }
}

4. 处理文件类型限制

你可以通过 type 参数限制用户选择的文件类型。例如,只允许选择图片文件:

void pickImage() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles(
    type: FileType.image,
  );

  if (result != null) {
    PlatformFile file = result.files.first;
    print('Image file: ${file.name}');
  } else {
    print('No image selected.');
  }
}

FileType 枚举支持以下类型:

  • FileType.any:任何文件类型
  • FileType.image:图片文件
  • FileType.video:视频文件
  • FileType.audio:音频文件
  • FileType.media:媒体文件(图片和视频)
  • FileType.custom:自定义文件类型(通过 allowedExtensions 参数指定)

5. 自定义文件类型

如果你想限制用户选择特定扩展名的文件,可以使用 FileType.custom 并指定 allowedExtensions 参数:

void pickCustomFile() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['pdf', 'doc', 'docx'],
  );

  if (result != null) {
    PlatformFile file = result.files.first;
    print('Custom file: ${file.name}');
  } else {
    print('No custom file selected.');
  }
}

6. 处理权限

在某些平台上,可能需要请求文件访问权限。file_picker_fork 内部会自动处理大部分权限请求,但在某些情况下,你可能需要手动处理权限(例如在 Android 上访问存储)。

7. Web 平台支持

在 Web 平台上,file_picker_fork 使用了浏览器的文件选择对话框,因此与原生平台的行为略有不同。你可以通过 FileTypeallowedExtensions 参数来控制文件选择。

8. 处理大文件

如果你需要处理大文件,建议将文件读取为流(FilePickerResult.files.first.readAsStream())以减少内存占用。

9. 错误处理

在使用 file_picker_fork 时,可能会遇到一些错误,例如用户取消选择或权限问题。你可以使用 try-catch 块来捕获并处理这些错误:

void pickFile() async {
  try {
    FilePickerResult? result = await FilePicker.platform.pickFiles();
    if (result != null) {
      PlatformFile file = result.files.first;
      print('File selected: ${file.name}');
    } else {
      print('No file selected.');
    }
  } catch (e) {
    print('Error picking file: $e');
  }
}
回到顶部