base on File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support. ![fluter_file_picker](https://user-images.githubusercontent.com/27860743/64064695-b88dab00-cbfc-11e9-814f-30921b66035f.png) <p align="center"> <a href="https://pub.dartlang.org/packages/file_picker"> <img alt="File Picker" src="https://img.shields.io/pub/v/file_picker.svg"> </a> <a href="https://github.com/Solido/awesome-flutter"> <img alt="Awesome Flutter" src="https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square"> </a> <a href="https://www.buymeacoffee.com/gQyz2MR"> <img alt="Buy me a coffee" src="https://img.shields.io/badge/Donate-Buy%20Me%20A%20Coffee-yellow.svg"> </a> <a href="https://github.com/miguelpruivo/flutter_file_picker/issues"> <img src="https://img.shields.io/github/issues/miguelpruivo/flutter_file_picker" alt="GitHub issues badge"> </a> <a href="https://github.com/miguelpruivo/flutter_file_picker?tab=MIT-1-ov-file"> <img src="https://img.shields.io/github/license/miguelpruivo/flutter_file_picker" alt="GitHub license badge"> </a> <a href="https://github.com/miguelpruivo/flutter_file_picker/actions/workflows/main.yml"> <img alt="CI pipeline status" src="https://github.com/miguelpruivo/flutter_file_picker/actions/workflows/main.yml/badge.svg"> </a> </p> # File Picker A package 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) * 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 * Load file data immediately into memory (`Uint8List`) if needed; * 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: | | `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](https://github.com/miguelpruivo/flutter_file_picker/wiki/api) or the [official API reference on pub.dev](https://pub.dev/documentation/file_picker/latest/file_picker/FilePicker-class.html) for further details. ## Documentation See the **[File Picker Wiki](https://github.com/miguelpruivo/flutter_file_picker/wiki)** for every detail on about how to install, setup and use it. ### File Picker Wiki 1. [Installation](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/Installation) 2. [Setup](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/Setup) * [Android](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/Setup#android) * [iOS](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/Setup#ios) * [Web](https://github.com/miguelpruivo/flutter_file_picker/wiki/Setup#--web) * [Desktop](https://github.com/miguelpruivo/flutter_file_picker/wiki/Setup#--desktop) 3. [API](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/api) * [Filters](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/API#filters) * [Parameters](https://github.com/miguelpruivo/flutter_file_picker/wiki/API#parameters) * [Methods](https://github.com/miguelpruivo/plugins_flutter_file_picker/wiki/API#methods) 4. [FAQ](https://github.com/miguelpruivo/flutter_file_picker/wiki/FAQ) 5. [Troubleshooting](https://github.com/miguelpruivo/flutter_file_picker/wiki/Troubleshooting) ## Usage Quick simple usage example: #### Single file ```dart FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null) { File file = File(result.files.single.path!); } else { // User canceled the picker } ``` #### Multiple files ```dart FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); if (result != null) { List<File> files = result.paths.map((path) => File(path!)).toList(); } else { // User canceled the picker } ``` #### Multiple files with extension filter ```dart FilePickerResult? result = await FilePicker.platform.pickFiles( allowMultiple: true, type: FileType.custom, allowedExtensions: ['jpg', 'pdf', 'doc'], ); ``` #### Pick a directory ```dart String? selectedDirectory = await FilePicker.platform.getDirectoryPath(); if (selectedDirectory == null) { // User canceled the picker } ``` #### Save-file / save-as dialog ```dart String? outputFile = await FilePicker.platform.saveFile( dialogTitle: 'Please select an output file:', fileName: 'output-file.pdf', ); if (outputFile == null) { // User canceled the picker } ``` ### Load result and file details ```dart 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 { // User canceled the picker } ``` ### Retrieve all files as XFiles or individually ```dart FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null) { // All files List<XFile> xFiles = result.xFiles; // Individually XFile xFile = result.files.first.xFile; } else { // User canceled the picker } ``` #### Pick and upload a file to Firebase Storage with Flutter Web ```dart FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null) { Uint8List fileBytes = result.files.first.bytes; String fileName = result.files.first.name; // Upload file await FirebaseStorage.instance.ref('uploads/$fileName').putData(fileBytes); } ``` For full usage details refer to the **[Wiki](https://github.com/miguelpruivo/flutter_file_picker/wiki)** above. ## Example App #### Android ![DemoAndroid](https://github.com/miguelpruivo/flutter_file_picker/blob/master/example/screenshots/example_android.gif?raw=true) #### iOS ![DemoMultiFilters](https://github.com/miguelpruivo/flutter_file_picker/blob/master/example/screenshots/example_ios.gif?raw=true) #### MacOS ![DemoMacOS](https://github.com/miguelpruivo/flutter_file_picker/blob/master/example/screenshots/example_macos.gif?raw=true) #### Linux ![DemoLinux](https://github.com/miguelpruivo/flutter_file_picker/blob/master/example/screenshots/example_linux.gif?raw=true) #### Windows ![DemoWindows](https://github.com/miguelpruivo/flutter_file_picker/blob/master/example/screenshots/example_windows.gif?raw=true) ## Getting Started For help getting started with Flutter, view our online [documentation](https://flutter.io/). For help on editing plugin code, view the [documentation](https://flutter.io/platform-plugins/#edit-code). ", Assign "at most 3 tags" to the expected json: {"id":"9433","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"