flutter_file_picker

A plugin that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.
Currently supported features
- Uses OS default native pickers
- Supports multiple platforms (Mobile, Web, Desktop)
- Supports WebAssembly (Wasm) compilation
- Pick files using custom format filtering — you can provide a list of file extensions (pdf, svg, zip, etc.)
- Pick files from cloud files (GDrive, Dropbox, iCloud)
- Single or multiple file picks
- Supports retrieving as
XFile(cross_file) for easy manipulation with other libraries - Different default type filtering (media, image, video, audio or any)
- Picking directories
- Picking both files and directories simultaneously
- Read file content easily via
file.readAsBytes()or stream viafile.readAsByteStream() - Open a save-file / save-as dialog (a dialog that lets the user specify the drive, directory, and name of a file to save)
If you have any feature that you want to see in this package, please feel free to issue a suggestion. 🎉
Compatibility Chart
| API | Android | iOS | Linux | macOS | Windows | Web |
|---|---|---|---|---|---|---|
clearTemporaryFiles() |
:white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: |
getDirectoryPath() |
:white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: |
pickFileAndDirectoryPaths() |
:x: | :x: | :x: | :white_check_mark: | :x: | :x: |
pickFile() |
:white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
pickFiles() |
:white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
saveFile() |
:white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
See the API section of the File Picker Wiki or the official API reference on pub.dev for further details.
Darwin implementation notes
The iOS and macOS native implementations live under the shared Darwin source tree (file_picker_darwin). The iOS implementation requires iOS 14.0 or newer because it uses PHPickerViewController and PHPickerResult.
Migrating to v12
Version 12.0 transitions file_picker to a federated plugin architecture.
Key Breaking Changes & Migration Steps
FilePicker.pickFiles()ReturnsList<PlatformFile>:FilePickerResulthas been removed in favor of direct lists ofPlatformFile.- Returns an empty list (
[]) if the user canceled the operation. - v11:
FilePickerResult? result = await FilePicker.pickFiles(); - v12:
List<PlatformFile> files = await FilePicker.pickFiles();
Single File Picking:
- Use
FilePicker.pickFile()to pick a single file returningPlatformFile?.
- Use
Reading Bytes and Streaming:
- Instead of using
withData: trueorwithReadStream: trueflags, usePlatformFilemethods directly:Uint8List bytes = await file.readAsBytes();Stream<Uint8List> stream = file.readAsByteStream();
- Instead of using
Platform Options:
- Platform-specific parameters are grouped into configuration options, with implementations per platform:
AndroidOptions/FilePickerAndroidOptionsWindowsOptions/FilePickerWindowsOptionsLinuxOptions/FilePickerLinuxOptionsWebOptions/FilePickerWebOptions
- Platform-specific parameters are grouped into configuration options, with implementations per platform:
Documentation
See the File Picker Wiki for details on installation, setup, and usage.
Usage
Single file
PlatformFile? file = await FilePicker.pickFile();
if (file != null) {
print(file.name);
print(await file.length());
} else {
// User canceled the picker
}
Multiple files
List<PlatformFile> files = await FilePicker.pickFiles();
if (files.isNotEmpty) {
for (final file in files) {
print(file.name);
}
} else {
// User canceled the picker
}
Multiple files with extension filter
List<PlatformFile> files = await FilePicker.pickFiles(
type: FileType.custom,
allowedExtensions: ['jpg', 'pdf', 'doc'],
);
Pick a directory
String? selectedDirectory = await FilePicker.getDirectoryPath();
if (selectedDirectory == null) {
// User canceled the picker
}
Save-file / save-as dialog
Uri? outputFile = await FilePicker.saveFile(
dialogTitle: 'Please select an output file:',
fileName: 'output-file.pdf',
bytes: pdfBytes,
);
if (outputFile == null) {
// User canceled the picker
}
