---
title: "Collect file uploads in your own storage"
description: "Add a file upload field whose files go browser-direct into your own Google Drive, Box, or S3/R2."
order: 24
type: "guide"
topic: "Use cases"
tags:
  - "file upload"
  - "S3"
  - "R2"
  - "own storage"
  - "resumable"
updated: "2026-07-26"
---

A file upload field in Fillo sends the uploaded bytes straight from the respondent's browser into storage you own — Google Drive, Box, or an S3-compatible bucket. Fillo opens and verifies the upload session and keeps the response plus a reference to each file, but the file itself never passes through a Fillo-owned bucket.

## Add an upload field

```ts
const intake = defineForm({
  id: "asset-intake",
  title: "Send us your files",
  pages: [
    {
      id: "main",
      blocks: [
        { id: "email", kind: "email", label: "Work email", required: true },
        {
          id: "assets",
          kind: "file_upload",
          label: "Upload your files",
          accept: [".pdf", ".png", ".jpg", ".mp4"],
          maxFiles: 5,
          required: true,
        },
      ],
    },
  ],
});
```

State the accepted formats and size in the label so respondents learn the rule before they pick a file, not after.

## Connect the storage you own

Before you publish an upload field, connect a storage provider in the dashboard: your own Google Drive, Box, or an S3-compatible bucket (including AWS S3 and Cloudflare R2). Files upload browser-direct to that account, and Fillo records each file's metadata alongside the response.

## Large and resumable uploads

Uploads go directly from the browser to the provider in multipart chunks, so they aren't bounded by a small request cap, and they're resumable where the provider supports it. Fillo alone controls when an upload is completed and when an incomplete one is cleaned up, so a dropped connection doesn't strand a half-written file or a live credential.

## Test the upload path

Run the form on a narrow screen and by keyboard, then try an oversized file, a disallowed type, an interrupted upload followed by a retry, and a clean success. Confirm the file lands in the intended storage account and that the response records the reference. See [File uploads](/docs/uploads) for provider setup and limits.

## Try it

[Start with a prompt](/start?from=guide-file-uploads) and your coding agent builds the first form, staged for your review — or [open the editor](/new).

## Related

- [Job application example](/examples#job-application): A working multi-page form with a resume upload.
- [File uploads](/docs/uploads): Connect Google Drive, Box, or S3/R2 and set file limits.
- [Data retention](/docs/data-retention): How long Fillo keeps responses and file references.
