How it works, in plain English
You don't need to know anything about cloud infrastructure to use this — but it helps to understand the basic flow, because you'll be wiring it up using Bubble workflows.
Someone picks a file. They tap the plugin's button (or your own button), and choose a photo or document from their device.
Your app asks for permission to upload. Before any file leaves the browser, the plugin asks your Bubble workflow: "I have a file called photo.jpg — can I upload it?" This is where your backend quietly talks to your cloud storage and gets back a special, temporary, one-time-use link called a presigned URL. Think of it like a guest pass that only works once, for one file, for a few minutes.
The file uploads directly to your storage. The plugin uses that temporary link to send the file straight to your cloud storage bucket — it never passes through Bubble's own servers.
You get the result back. Once the upload finishes, the plugin tells your workflow the public link (and the storage "key") for that file, which you can save to your database, attach to a user's profile, show in a gallery, etc.
If someone picks several files at once, the plugin repeats steps 2–3 for each file, one at a time, automatically.
A note on security
You might be wondering: "Doesn't this plugin need my secret AWS keys?" — No, and that's intentional. Your Access Key ID and Secret Access Key (covered in the next page) are never typed into this plugin and never sent to anyone's browser. They live only on your server side (inside a Bubble backend workflow or an external API), where they're used to generate that temporary presigned URL. The plugin itself only ever sees the temporary link — never your permanent credentials.
Documentation available at
https://docs.nocodeventure.com/plugins/s3-file-upload-web-mobileDemo page:
https://ncv-demos6.bubbleapps.io/version-test/s3_uploaderEditor:
https://bubble.io/page?id=ncv-demos6&tab=Design&name=s3_uploader&type=page&elements=bTJFP0Using a different storage provider
This plugin doesn’t talk to AWS specifically — it just sends a file to whatever presigned URL your backend hands it. That means it works just as well with any storage service that speaks the same “S3 API,” including:
Cloudflare R2
Backblaze B2
Wasabi
DigitalOcean Spaces
MinIO (self-hosted)