NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #758 most downloaded on pub.dev
Save files from bytes, paths, streams, and URLs across Android, iOS, Web, Windows, macOS, and Linux.
Last release 2 days ago
06 Oct 2026
Release timing varies
gaps range from 2 weeks to 10 months
Nearly every release is documented
notes for 35 of 35 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
35 releases · first in 2021
One column per quarter.
Added saveAs on Linux. It uses GtkFileChooserNative , so sandboxed apps (Flatpak, Snap) get the XDG desktop portal and everything else gets the GTK di
saveAs on Linux. It uses GtkFileChooserNative, so sandboxed apps (Flatpak, Snap) get the XDG desktop portal and everything else gets the GTK dialog. initialDirectory and dialogTitle are supported, and the file is written with GIO's async API so large files never block the UI thread.
tool/pigeon.sh also formats the generated Dart file, so regenerating no longer produces a formatting-only diff.details carries only a non-sensitive identifier: the exception class name on Android (FileNotFoundException), "<domain> <code>" on iOS, macOS and Linux. Previously the message could contain file paths, content URIs, or a process's pid/uid, and Android also logged it. Error codes are unchanged. If you matched on PlatformException.message, match on code instead.
WRITE_EXTERNAL_STORAGE grant on Android 9 and below now reports code PermissionDenied, and a non-media mime type passed to saveToGallery reports InvalidMimeType, instead of the generic gallery/Downloads error.saveAs on an unsupported platform throws UnsupportedError naming the platform, instead of UnimplementedError('Unimplemented Error').Added saveToDownloads for writing into the shared Downloads folder without a dialog, with an optional subfolder . Android uses MediaStore (no permissi
saveToDownloads for writing into the shared Downloads folder without a dialog, with an optional subfolder. Android uses MediaStore (no permission on Android 10+); macOS, Windows and Linux write to the user's Downloads directory; web triggers a browser download; iOS throws UnsupportedError.
sourcePath, so saveToDownloads(filePath:) copies without loading the file into memory.Breaking: replaced the dio dependency with package:http .
dio dependency with package:http.
dioClient is now httpClient (http.Client?) on saveFile, saveAs and saveLinkAsStream.transformDioResponse is removed; responses are always bytes. Fetch and transform yourself, then pass bytes:.LinkDetails.responseType is removed. LinkDetails.uri exposes the link with queryParameters merged.http.ClientException instead of writing the error body to disk.com.apple.security.files.downloads.read-write when the Downloads write fails, com.apple.security.network.client when the download fails.
initialDirectory to saveAs, saveAsStream and saveLinkAsStream so the save dialog can open in a chosen folder (macOS, Windows, iOS, Android).
saveToGallery for saving images and videos to the photo library — MediaStore on Android, Photos on iOS — with an optional album.
dialogTitle to saveAs, saveAsStream and saveLinkAsStream (macOS, Windows).
saveAs converts initialDirectory and dialogTitle from UTF-8 with MultiByteToWideChar.saveFile now throws a PlatformException on failure instead of returning an error message as the path.saveAs survives rotation while the picker is open, fails cleanly when the Activity is destroyed or no app can show the picker, and rejects a second saveAs while one is open instead of silently dropping the first. Error details no longer carry a Throwable the channel codec cannot encode.[UInt8], the picker is presented on the top-most controller, and a second saveAs while one is open is rejected."Failed to save file" as the path.MAX_PATH statics (a long file name aborted the process), builds the filter correctly, converts names and paths from UTF-8, and reports dialog errors instead of treating them as cancel.null like other platforms; a failed stream is aborted without masking the original error.saveAsStream deletes its temp file when the stream fails.pigeons/messages.dart (regenerate with tool/pigeon.sh), so argument mismatches fail at compile time. Windows saveAs returns the path as a UTF-8 string. macOS deployment target is now 10.15.FileUtils.kt and the duplicate macos/Classes sources — macOS builds from macos/file_saver/Sources for both CocoaPods and Swift Package Manager.Added Swift Package Manager support for iOS and macOS.
dart:io and platform-specific path provider implementations.saveAs file writes off the main thread and avoids resolving SAF document paths after saving.saveAs support using the existing browser download flow.downloadLink for web browser handoff and Android DownloadManager downloads without loading bytes into Dart memory.saveAsStream for native streamed writes via a temporary file.saveLinkAsStream for authenticated streamed URL downloads with request headers where supported.saveAs to avoid loading filePath inputs into memory.saveAs fileExtension optional.saveAs cancellation so the platform call always completes.saveAs.Added includeExtension boolean parameter to control whether file extension should be included in the saved filename
includeExtension boolean parameter to control whether file extension should be included in the saved filenameext to fileExtension for better clarity and consistencyFixed and added saveAs for windows
saveAs for windowsMerged PR #117 to update conditional imports for web (wasm)
Added 3 MP4 mime types for better compatibility with the MP4 files
Minor network related bug fixes, fixing issue #105
Merged PR #87 for backward compatibility with the older versions of java
Moved from http to dio for better control over the headers and other options
http to dio for better control over the headers and other optionsmethod & body LinkDetails(
link: "www.example.com/file.extention",
headers: /// Your headers here,
method: /// Your method here (GET, POST, PUT, DELETE, PATCH),
body: /// Request body here
),saveFile and saveAs methods now have the dioClient & transformDioResponse as a parameter, so you can pass your own dio client to the method and it will use that client to download the file & you can also pass the transformDioResponse to transform the response as per your requirement.\
await FileSaver.instance.saveFile(
name: "FileName",
link: "www.example.com/file.extention",
filePath: "pathOfFile",
file: File(),
bytes: bytes,
ext: "extention",
mimeType: MimeType.pdf,
dioClient: Dio(),
transformDioResponse: (response) {
return response.data;
});Merged PR #75 resolving issue [ #75 ][https://github.com/ /issues/75 ]
Moving saveAs() support for macOS to production.
Updated the http package to the latest version (issue #63 )
Merged ([PR70])(https://github.com/incrediblezayed/file_saver/pull/70), resolving the issue ([#42])
Added custom mimetype \ So basically if you have a custom mimetype and it does not exists in the given enum, you can add your own mimeType using the f
String? customMimeType,
and you will have to set the mimetype to custom and call the method like
await FileSaver.instance.saveFile(
name: "FileName",
link: "www.example.com/file.extention",
filePath: "pathOfFile",
file: File(),
bytes: bytes,
ext: "extention",
customMimeType: 'YourCustomType',
mimeType: MimeType.custom);
Bug Fix -> Link Details not available publically
Replaced the `String? link with LinkDetails? link` in order to add headers with the link for downloading file
String? link with LinkDetails? link in order to add headers with the link for downloading fileImplemented the web platform without method channel, using the conditional imports.
Fixed a bug in web (git issue #57)
MimeType.pdf.type
And if you want the formatted name of the given type, you can get it by
MimeType.pdf.name
Fixed several issues from github
Fixed several issues from github
Feature Added a parameter link for saving file directly through network
Feature Added filePath if you have the filepath, no need to get the bytes of the file, you can directly pass the path in filePath parameter and the file_saver will do the rest
Feature Added file parameter to direct save the file from File object
Regardless of all the new options for saving files, bytes parameter is still there and you can still use it but, All the parameters are optional now so you have to use atleast one of these parameter (link, filePath, file, bytes)
Changed all the parameters to named instead of positional so now instead of
await FileSaver.instance.saveFile("FileName", bytes, "extension", mimeType: mimeType);
await FileSaver.instance.saveAs("File", bytes, "extension", type);
you will have to use
await FileSaver.instance.saveFile(
name: "FileName",
link: "www.example.com/file.extention",
filePath: "pathOfFile",
file: File(),
bytes: bytes,
ext: "extention",
mimeType: type);
await FileSaver.instance.saveFile(
name: "FileName",
link: "www.example.com/file.extention",
filePath: "pathOfFile",
file: File(),
bytes: bytes,
ext: "extention",
mimeType: type);
Changed the MimeType enum values to lower case (as per dart's naming conventions)
Upgraded everything to latest versions (gradle tools = 7.4.2, kotlin=1.8.0)
Updated the pub to the latest commit, fixing the issues with flutter 3.
Fixed the incomplete path in saveFile method (GitHub issue #16)
* Fixed Path Provider version
Updated Kotlin version to 1.16.10
Due to security reasons, I'm not able to save the files to downloads folder in android, if anyone has any idea that would work on Android 11 so please
* Android Permission Bug Fixed * Other bugs fixes
* Minor Bug Fixes * Updated Readme
Added Save as method for Android and iOS, more coming soon
* Added More File Types
* Minor Bug Fixes
saveFile method returns the path where the file is saved.
* Minor Bug Fixes
* Updated Guide
* File Saver for all platforms
Your coding agent can read these notes before it upgrades. Set up the MCP server →