Uppy 
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, has a comprehensible API and lets you worry about more important problems than building a file uploader.
- Fetch files from local disk, remote URLs, Google Drive, Dropbox, Box, or snap and record selfies with a camera
- Preview and edit metadata with a nice interface
- Upload to the final destination, optionally process/encode
Uppy is being developed by the folks at Transloadit, a versatile API to handle any file in your app.
| Tests | |||
|---|---|---|---|
| Deploys |
Example
Code used in the above example:
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import RemoteSources from '@uppy/remote-sources'
import ImageEditor from '@uppy/image-editor'
import Webcam from '@uppy/webcam'
import Tus from '@uppy/tus'
const uppy = new Uppy()
.use(Dashboard, { trigger: '#select-files' })
.use(RemoteSources, { companionUrl: 'https://companion.uppy.io' })
.use(Webcam)
.use(ImageEditor)
.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
.on('complete', (result) => {
console.log('Upload result:', result)
})
Try it online or read the docs for more details on how to use Uppy and its plugins.
Integrations
Uppy has first-class support for plain JS/HTML, React, Svelte, Vue, and Angular.
For the supported frameworks (except Angular) Uppy offers three ways to build user interfaces:
- Pre-composed, plug-and-play components. Mainly ``. The downside is that you can’t customize the UI.
- Headless components. Smaller components, easier to override the styles or compose them together with your own components.
- Hooks. Attach our logic to your own components, no restrictions, create a tailor-made UI.
Features
- Lightweight, modular plugin-based architecture, light on dependencies :zap:
- Resumable file uploads via the open tus standard, so large uploads survive network hiccups
- Supports picking files from: Webcam, Dropbox, Box, Google Drive, bypassing the user’s device where possible, syncing between servers directly via @uppy/companion
- Works great with file encoding and processing backends, such as Transloadit, which handles encoding, conversion and delivery for you; works great without one too, if you would rather run and scale your own Apache/Nginx/Node/FFmpeg pipeline
- Sleek user interface :sparkles:
- Optional file recovery (after a browser crash) with Golden Retriever
- Speaks several languages (i18n) :earth_africa:
- Built with accessibility in mind
- Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽)
- Cute as a puppy, also accepts cat pictures :dog:
Installation
npm install @uppy/core @uppy/dashboard @uppy/tus
Add CSS uppy.min.css, either to your HTML page’s `` or include in JS, if your bundler of choice supports it.
Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: Smart
CDN. In that case Uppy will attach itself to the global window.Uppy object.
⚠️ The bundle consists of most Uppy plugins, so this method is not recommended for production, as your users will have to download all plugins when you are likely using only a few.
<!-- 1. Add CSS to `<head>` -->
<link
href="https://releases.transloadit.com/uppy/v6.0.1/uppy.min.css"
rel="stylesheet"
/>
<!-- 2. Initialize -->
<div id="files-drag-drop"></div>
<script type="module">
import {
Uppy,
Dashboard,
Tus,
} from 'https://releases.transloadit.com/uppy/v6.0.1/uppy.min.mjs'
const uppy = new Uppy()
uppy.use(Dashboard, { target: '#files-drag-drop' })
uppy.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
</script>
Documentation
- Uppy — full list of options, methods and events
- Companion — setting up and running a Companion instance, which adds support for Dropbox, Box, Google Drive and remote URLs
- React — components to integrate Uppy UI plugins with React apps
- Architecture & Writing a Plugin — how to write a plugin for Uppy
Plugins
UI Elements
Dashboard— universal UI with previews, progress bars, metadata editor and all the cool stuff. Required for most UI plugins like Webcam- Headless components (react, svelte, vue)
Sources
Drag & Drop— plain drag and drop areaFile Input— even plainer “select files” buttonWebcam— snap and record those selfies 📷- ⓒ
Google Drive— import files from Google Drive - ⓒ
Dropbox— import files from Dropbox - ⓒ
Box— import files from Box - ⓒ
Facebook— import images and videos from Facebook - ⓒ
OneDrive— import files from Microsoft OneDrive - ⓒ
Import From URL— import direct URLs from anywhere on the web
The ⓒ mark means that @uppy/companion, a
server-side component, is needed for a plugin to work.
Destinations
Tus— resumable uploads via the open tus standardXHR Upload— regular uploads for any backend out there (like Apache, Nginx)AWS S3— plain upload to AWS S3 or compatible services
File Processing
Transloadit— creates Assemblies that upload files to Transloadit’s encoding backend. See the integration guide for JavaScript, React, Next.js, Vue, and Angular examples with server-signed Assembly options
Miscellaneous
Golden Retriever— restores files after a browser crash, like it’s nothingThumbnail Generator— generates image previews (included by default withDashboard)Form— collects metadata from `` right before an Uppy upload, then optionally appends results back to the form
Browser Support
We aim to support recent versions of Chrome, Firefox, and Safari.
FAQ
Why not use ``?
Having no JavaScript beats having a lot of it, so that’s a fair question! Running an uploading & encoding business for ten years though we found that in cases, the file input leaves