Modern web applications increasingly behave like native apps, and users expect the same level of reliability β€” especially when it comes to something as fundamental as file uploads. If you're building a cloud storage product or anything involving large file transfers, you've probably encountered a frustrating limitation: uploads fail when the tab closes or the network drops, forcing users to start over.

In this article, I'll walk through how I solved this problem in a production environment by leveraging modern browser capabilities β€” specifically the File System Access API β€” and a simple architectural idea that led to a measurable product improvement.

The Problem: Fragile Uploads

While working on a cloud storage service (similar to Google Drive), one of our key features was file uploads. Straightforward, right? Not quite.

We observed a recurring issue:

  • If a user closed the tab β†’ upload was lost
  • If the internet connection dropped β†’ upload was lost
  • If the file was large (e.g. gigabytes) β†’ frustration was inevitable

This wasn't just a technical inconvenience β€” it directly affected user experience and business metrics.

The Insight That Changed Everything

The turning point came after a conference, where I had a conversation with a Google engineer. He mentioned something surprisingly simple but powerful:

You can persist access to a file in the browser and resume operations later β€” without requiring the user to reselect the file.

That idea became the foundation of the solution.

The Core Idea

Instead of treating file uploads as a one-time operation tied to a single session, we can make them stateful and recoverable.

The approach looks like this:

  1. When the user selects a file, the browser provides a special reference (a file handle)
  2. This handle can be stored locally in the browser (e.g. in IndexedDB)
  3. If the upload is interrupted (tab closed, network lost, crash, etc.), the app can retrieve that handle later
  4. Using this handle, the app can access the same file again β€” without asking the user
  5. Upload resumes automatically from where it stopped

The key shift here is simple but powerful:

The browser becomes responsible for remembering the file, not the user.

Why This Works

Traditionally, browsers forget everything about a file once the page is gone. That's why users have to reselect files after interruptions.

But with the File System Access API, the browser can:

  • Maintain a persistent reference to a file
  • Re-grant access (with permission)
  • Allow the application to continue working with that file later

Combined with a backend that supports resumable uploads (e.g. chunked transfers and offset tracking), this creates a seamless recovery experience.

What the User Experiences

From the user's perspective, the improvement is almost invisible β€” but incredibly valuable:

  • They start uploading a large file
  • Something goes wrong (tab closed, internet drops, laptop sleeps)
  • They return later
  • The upload simply continues

No re-selection. No restarting. No frustration.

Real-World Impact

After implementing this approach:

  • Upload reliability improved significantly
  • Large file uploads stopped being a pain point
  • A core product metric increased by 3%

What's important here is that this gain came without adding any friction. The user didn't need to learn anything new or perform extra steps.

Trade-offs and Limitations

This approach is powerful, but not universal:

  • It works best in Chromium-based browsers
  • Permissions are still part of the security model
  • Local storage (IndexedDB) is not guaranteed forever
  • You still need proper backend support for resumable uploads

That said, for many real-world products, these constraints are acceptable compared to the UX gains.

When This Approach Makes Sense

You should consider this pattern if:

  • You're building a cloud storage or media-heavy application
  • Users upload large files
  • Reliability and completion rate matter
  • You want to reduce friction without adding UI complexity

Learn More

The implementation details are based on the File System Access API. You can explore it here:

https://developer.chrome.com/docs/capabilities/web-apis/file-system-access

Final Thoughts

Sometimes, meaningful product improvements don't come from big redesigns or new features, but from rethinking how existing capabilities are used.

In this case, the shift was simple:

  • Stop treating uploads as temporary
  • Start treating them as recoverable processes

That small change turned a fragile experience into a resilient one β€” and delivered measurable business impact.

If you're working on file uploads, this is one of those ideas that's absolutely worth exploring.