Skip to content
Files SDK
Esc
↑↓navigate↵open⌘Jpreview

Adapters

Compare the 49 storage backends Files SDK supports, from Cloudflare R2 and S3 to Vercel Blob and the local filesystem, by what each one can do.

An adapter connects Files to one storage backend. Each is its own subpath export (files-sdk/r2, files-sdk/gcs, …) and runs the same methods, so switching providers means swapping the adapter and nothing else. Its provider’s SDK is an optional peer dependency, so the adapters you never import are never bundled.

Each adapter’s page covers installation, the options it takes, and a compatibility table for anything the provider does differently. The provider catalog has the same list as data, with the environment variables each adapter reads.

These providers help maintain Files SDK by sponsoring its development.

Other adapters

Compare adapters

Every adapter runs the same methods. Where providers differ is in the options those methods take: a byte range, a folder listing, custom metadata, and so on. An adapter that can’t do something throws before calling the provider, instead of quietly ignoring the option. The table shows what each adapter supports with its default options. At runtime, files.capabilities reports the same flags for the adapter you configured.

What each adapter supports with its default options
AdapterRange readsFoldersMetadataCache-ControlResumable uploadsServer-side copyUpload progressStorage eventsSigned URLsDirect uploadsConditional writes
Cloudflare R2RecommendedYesYesYesYesYesYesYesYes7 daysYesNo
Akamai Cloud Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
Alibaba Cloud OSSYesYesYesYesYesYesYesNo7 daysSize-cappedNo
AppwriteNoNoNoNoYesNoNoYesNoNoNo
ArchilYesYesYesYesYesYesYesNo7 daysSize-cappedNo
Azure Blob StorageYesYesYesYesYesYesYesYesYesYesNo
Backblaze B2YesYesYesYesYesYesYesYes7 daysYesNo
BoxYesYesNoNoYesYesNoYesProvider-setNoNo
Bun S3YesYesNoNoYesNoNoNo7 daysYesNo
Bunny StorageNoNoNoNoNoNoNoNoNoNoNo
CloudinaryYesYesNoNoYesNoNoYesNoYesNo
ConvexNoNoNoNoNoNoNoNoNoNoNo
DigitalOcean SpacesYesYesYesYesYesYesYesNo7 daysSize-cappedNo
DropboxYesYesNoNoYesYesNoNoProvider-setNoNo
Exoscale Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
FilebaseYesYesYesYesYesYesYesNo7 daysSize-cappedNo
FilesystemYesYesYesYesYesYesNoNoNoNoNo
Firebase StorageYesYesYesYesYesYesYesYes7 daysSize-cappedNo
FTPYesYesNoNoYesNoYesNoNoNoNo
Google Cloud StorageYesYesYesYesYesYesYesYes7 daysSize-cappedNo
Google DriveYesYesYesNoYesYesNoNoNoYesNo
Hetzner Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
IBM Cloud Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
iDrive e2YesYesYesYesYesYesYesNo7 daysSize-cappedNo
In-MemoryYesYesYesYesYesYesNoYesNoNoNo
MinIOYesYesYesYesYesYesYesYes7 daysSize-cappedNo
NeonYesYesYesYesYesYesYesNo7 daysSize-cappedNo
Netlify BlobsNoYesYesYesNoNoNoNoNoNoNo
OneDriveYesYesNoNoYesYesNoNoNoYesNo
Oracle Cloud Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
OVHcloud Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
PocketBaseYesNoNoNoNoNoNoNoProvider-setNoNo
Railway BucketsYesYesYesYesYesYesYesNo7 daysSize-cappedNo
RustFSYesYesYesYesYesYesYesYes7 daysSize-cappedNo
S3YesYesYesYesYesYesYesYes7 daysSize-cappedYes
S3 (fetch)YesYesYesYesNoYesNoYes7 daysYesNo
Scaleway Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
SFTPYesYesNoNoYesNoNoNoNoNoNo
SharePointYesYesNoNoYesYesNoNoNoYesNo
StorjYesYesYesYesYesYesYesYes7 daysSize-cappedNo
Supabase StorageNoYesYesYesYesYesNoYesYesYesNo
Tencent Cloud Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
TigrisYesYesYesYesYesYesYesYes7 daysSize-cappedNo
UploadThingYesNoNoNoNoNoNoNoNoYesNo
Vercel BlobYesYesNoYesYesYesYesNoNoSize-cappedNo
Vultr Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
WasabiYesYesYesYesYesYesYesYes7 daysSize-cappedNo
WebDAVYesYesNoNoNoYesNoNoNoNoNo
Yandex Object StorageYesYesYesYesYesYesYesNo7 daysSize-cappedNo
  • Range reads: download(key, { range }) fetches only the bytes you ask for.
  • Folders: list({ delimiter: "/" }) returns one level of a hierarchy, with subfolders as prefixes.
  • Metadata and Cache-Control: upload() stores custom metadata or a Cache-Control header on the object.
  • Resumable uploads: upload() with an UploadControl can pause, resume, and pick up in a later process. See resumable uploads.
  • Server-side copy: copy() happens inside the provider, without downloading and re-uploading the body.
  • Upload progress: the provider reports byte-level progress for every body. Without it, onProgress still reports bytes for stream bodies, and start and finish for buffered ones.
  • Signed URLs: url() returns a link that expires, up to the lifetime shown. Some adapters sign only in some modes: Vercel Blob only with access: "private", Dropbox unless publicByDefault is set, and R2’s Workers binding only with HTTP credentials as well.
  • Conditional writes: uploads that apply only if the key is absent, or still has a given ETag. The s3() adapter uses S3’s conditional requests on AWS; against another S3-compatible endpoint, opt in with conditional: true where the provider supports them. See conditional operations.

Last updated on

Was this page helpful?