Save any file from your Bubble native mobile app to the user’s device (gallery, iOS share sheet or Android Downloads folder).
Make images and videos go to the iOS Photos or Android Gallery, and documents and other files go through the native iOS share sheet or land in the Android Downloads folder. Permissions are handled automatically across iOS 11+ and Android 6+. Error messages are translated in twelve languages.
/!\ This plugin only works in native apps /!\
See in Demo App ·
See in Bubble Editor ·
Full user documentation
Choose where to save filesPhoto gallery. Saves to iOS Photos or Android Gallery. The user finds the file in the same place as photos they took themselves; standard share, edit, and delete affordances all work. The plugin requests the photo library permission the first time it is needed and remembers the decision. Recommended for PNG, JPEG, GIF, WebP, MP4, MOV…
Device files. On iOS, opens the native document previewer with the system Share button (“Save to Files”, AirDrop, WhatsApp, Gmail, Print, and every share target the user has installed). On Android, the file is copied to the public Downloads or Documents folder. Recommended for PDF, CSV, XLSX, and any document type.
Optional native notifications during downloadsYou can enable OS-native notifications when a download starts (“Downloading invoice.pdf…”) and when it ends (“Saved” or “Download failed”). Same behavior on iOS and Android. The notification permission is requested in context, the first time the user triggers a download with notifications enabled; if they decline, downloads still work, just without the notification feedback. Opt-in by design.
Three ways to source a filePublic HTTPS URLs. Any image hosted on the open web, any file served by a third-party API.
Bubble database File and Image fields. Bubble stores these as protocol-relative URLs (starting with
// instead of
https://). The plugin detects and normalizes these automatically; you can wire any Bubble File or Image directly into the Source URL field.
Base64 content. For files generated on the fly (PDF receipts built in a workflow, signed certificates, screenshots taken via another plugin), pass the base64 string directly. The plugin decodes and writes the file in a single step.
Features includedMultiple downloads at once. A Download Multiple Files action takes a list of URLs and downloads each one.
On Android and on iOS with the gallery destination, each file emits its own events and lands as an individual file in the destination. On iOS with the device-files destination, the plugin bundles every successful download of the batch into a single ZIP archive and presents one share sheet for the archive; the user taps “Save to Files” once and extracts the ZIP natively in Files.app with a single tap. This is the cleanest UX iOS allows for multi-file downloads to user storage.
Per-download cancel. A Cancel Download action stops a single in-flight transfer cleanly. A Cancel All Downloads action stops everything; useful when the user navigates away or signs out.
Native progress events. Fires “Download started”, “Download progress”, “Download complete”, “Download error”, and “Cancelled” so you can build any UX. Three exposed states track in-flight downloads (Is Downloading, Active Downloads Count, Current Progress); four track results (Last File ID, Last File URI, Last File Size, Last File MIME Type); two track failures (Last Error Code, Last Error Message).
Automatic permissions. iOS and Android use different permission models, with breaking changes at almost every OS version. The plugin handles iOS 11+ photo library permissions, Android 6 to 9 storage permissions, Android 10 to 12 scoped storage, Android 13+ granular media permissions, in one consistent API. You won’t need any “Request permission” action in your workflows.
Custom headers. Pass any header the source requires: Authorization tokens, signed-URL parameters, content negotiation. JSON object in, headers out.
Size limit and timeout. Set a per-element maximum file size (in MB) and a default timeout (in seconds). Oversized or hanging downloads fail cleanly with a translated error.
Multilingual error messages. English, French, Spanish, German, Italian, Brazilian Portuguese, European Portuguese, Dutch, Polish, Japanese, Korean, Simplified Chinese. Language is detected automatically from the device locale; English fallback for any other language. Override any message via a JSON field on the element.
Documentation and AI supportWe built the documentation we wish every plugin had.
A full user guide covers every field, every state, every workflow recipe, and a complete troubleshooting section.
Plus, the plugin ships with a context document designed to be pasted into any LLM. Once pasted, your AI assistant knows every field, every state, every event, every strategy, and the most common configuration patterns of the plugin. It can write your Bubble dynamic expressions, diagnose a misbehaving download, and suggest the right configuration for your specific use case, without you having to dig through documentation yourself.
You can download it from the
user documentation.
——————————————————————
[size=5
/!\ This plugin only works in native apps /!\[/size]
It won’t work for web apps or WebView-wrapped apps (BDK, Natively and similar wrappers do not use the React Native runtime the plugin relies on).
——————————————————————
Try risk-freeThe monthly subscription is prorated by the day. Try the plugin for a few days; if it is not the right fit, cancel and pay only for the days you used.