---
type: docs
order: 2
title: "File Input"
module: "@uppy/file-input"
permalink: docs/file-input/
alias: docs/fileinput/
category: "Sources"
tagline: "even more plain and simple, just a button"
---
`@uppy/file-input` is the most barebones UI for selecting files — it shows a single button that, when clicked, opens up the browser’s file selector.
```js
const FileInput = require('@uppy/file-input')
uppy.use(FileInput, {
// Options
})
```
Try it live
The `@uppy/xhr-upload` example uses `@uppy/file-input` with the [`pretty`](#pretty-true) option enabled.
## Installation
This plugin is published as the `@uppy/file-input` package.
Install from NPM:
```shell
npm install @uppy/file-input
```
In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
```js
const FileInput = Uppy.FileInput
```
## CSS
The `@uppy/file-input` plugin includes some simple styles for use with the [`pretty`](#pretty-true) option, like shown in the [example](/examples/xhrupload). You can also choose not to use it and provide your own styles instead.
```js
import '@uppy/core/dist/style.css'
import '@uppy/file-input/dist/style.css'
```
Import general Core styles from `@uppy/core/dist/style.css` first, then add the File Input styles from `@uppy/file-input/dist/style.css`. A minified version is also available as `style.min.css` at the same path. The way to do import depends on your build system.
## Options
The `@uppy/file-input` plugin has the following configurable options:
```js
uppy.use(FileInput, {
target: null,
pretty: true,
inputName: 'files[]',
locale: {
}
})
```
> Note that certain [restrictions set in Uppy’s main options](/docs/uppy#restrictions), namely `maxNumberOfFiles` and `allowedFileTypes`, affect the system file picker dialog. If `maxNumberOfFiles: 1`, users will only be able to select one file, and `allowedFileTypes: ['video/*', '.gif']` means only videos or gifs (files with `.gif` extension) will be selectable.
### `id: 'FileInput'`
A unique identifier for this plugin. It defaults to `'FileInput'`. Use this if you need to add multiple FileInput instances.
### `target: null`
DOM element, CSS selector, or plugin to mount the file input into.
### `pretty: true`
When true, display a styled button (see [example](/examples/xhrupload)) that, when clicked, opens the file selector UI. When false, a plain old browser `` element is shown.
### `inputName: 'files[]'`
The `name` attribute for the `` element.
### `locale: {}`
When `pretty` is set, specify a custom label for the button.
```js
strings: {
chooseFiles: 'Choose files'
}
```
## Custom file input
If you don’t like the look/feel of the button rendered by `@uppy/file-input`, feel free to forgo the plugin and use your own custom button on a page, like so:
```html
```
Then add this JS to attach it to Uppy:
```js
const uppy = Uppy(...)
const fileInput = document.querySelector('#my-file-input')
fileInput.addEventListener('change', (event) => {
const files = Array.from(event.target.files)
files.forEach((file) => {
try {
uppy.addFile({
source: 'file input',
name: file.name,
type: file.type,
data: file
})
} catch (err) {
if (err.isRestriction) {
// handle restrictions
console.log('Restriction error:', err)
} else {
// handle other errors
console.error(err)
}
}
})
})
```