This guidance is for government teams that build online services. To find information and services for the public, go to GOV.UK.
WCAG 2.2
New WCAG 2.2 criteria affect this component
To use the ‘File upload’ and meet the new Web Content Accessibility Guidelines (WCAG) 2.2 criteria:
See the full list of components and patterns affected by WCAG 2.2.
Help users select and upload a file.
<div class="govuk-form-group">
<label class="govuk-label" for="file-upload-1">
Upload a file
</label>
<input class="govuk-file-upload" id="file-upload-1" name="fileUpload1" type="file">
</div>
Nunjucks macro options
Use options to customise the appearance, content and behaviour of a component when using a macro, for example, changing the text.
Some options are required for the macro to work; these are marked as “Required” in the option description. Deprecated options are marked as “Deprecated”.
If you’re using Nunjucks macros in production with “html” options, or ones ending with “html”, you must sanitise the HTML to protect against cross-site scripting exploits.
Primary options
string |
Required.
The name of the input, which is submitted with the form data.
|
string |
The ID of the input. Defaults to the value of name .
|
string |
Deprecated in 5.7.1
Optional initial value of the input.
|
boolean |
If true , file input will be disabled.
|
boolean |
If true , a user may select multiple files at the same time. The exact mechanism to do this differs depending on operating system.
|
string |
One or more element IDs to add to the aria-describedby attribute, used to provide additional descriptive information for screenreader users.
|
object |
Required.
The label used by the file upload component.
See macro options for label.
|
object |
Can be used to add a hint to the file upload component.
See macro options for hint.
|
object |
Can be used to add an error message to the file upload component. The error message component will not display if you use a falsy value for errorMessage , for example false or null .
See macro options for errorMessage.
|
object |
Additional options for the form group containing the file upload component.
See macro options for formGroup.
|
boolean |
Can be used to enable JavaScript enhancements for the component.
|
string |
The text of the button that opens the file picker. Default is "Choose file" . If javascript is not provided, this option will be ignored.
|
string |
The text informing users they can drop files. Default is "or drop file" . If javascript is not provided, this option will be ignored.
|
object |
The text displayed when multiple files have been chosen by the user. The component will replace the %{count} placeholder with the number of files selected. Our pluralisation rules apply to this macro option. If javascript is not provided, this option will be ignored.
|
string |
The text displayed when no file has been chosen by the user. Default is "No file chosen" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and enters the drop zone. Default is "Entered drop zone" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and leaves the drop zone without dropping. Default is "Left drop zone" . If javascript is not provided, this option will be ignored.
|
string |
Classes to add to the file upload component.
|
object |
HTML attributes (for example data attributes) to add to the file upload component.
|
Options for label
component
string |
Required.
If html is set, this is not required. Text to use within the label. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the label. If html is provided, the text option will be ignored.
|
string |
The value of the for attribute, the ID of the input the label is associated with.
|
boolean |
Whether the label also acts as the heading for the page.
|
string |
Classes to add to the label tag.
|
object |
HTML attributes (for example data attributes) to add to the label tag.
|
Options for hint
component
string |
Required.
If html is set, this is not required. Text to use within the hint. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the hint. If html is provided, the text option will be ignored.
|
string |
Optional ID attribute to add to the hint span tag.
|
string |
Classes to add to the hint span tag.
|
object |
HTML attributes (for example data attributes) to add to the hint span tag.
|
{% from "govuk/components/file-upload/macro.njk" import govukFileUpload %}
{{ govukFileUpload({
id: "file-upload-1",
name: "fileUpload1",
label: {
text: "Upload a file"
}
}) }}
When to use this component
You should only ask users to upload something if it’s critical to the delivery of your service.
We improved the component in March 2025, so you’ll need to enable the improved File upload component as a new feature.
Read a blog post about design tips for helping users upload things.
How it works
To upload a file, the user can either:
- use the ‘Choose file’ button
- drag and drop a file into the file upload input area
WCAG 2.2
Make sure users can easily reuse a previously uploaded file within a single journey, unless doing so would be a major security or privacy concern.
For example, a user might need to upload a photo of their driving licence to prove their identity, and again to prove their address.
You can make it easier for the user to reuse a file by showing it as an option for the user to select so they do not need to upload it again. This is to comply with WCAG 2.2 success criterion 3.3.7 Redundant entry. Consider users on public devices before choosing to make the file available to preview or download.
There are 2 ways to use the file upload component. You can use HTML or, if you’re using Nunjucks or the GOV.UK Prototype Kit, you can use the Nunjucks macro.
<div class="govuk-form-group">
<label class="govuk-label" for="file-upload-1">
Upload a file
</label>
<input class="govuk-file-upload" id="file-upload-1" name="fileUpload1" type="file">
</div>
Nunjucks macro options
Use options to customise the appearance, content and behaviour of a component when using a macro, for example, changing the text.
Some options are required for the macro to work; these are marked as “Required” in the option description. Deprecated options are marked as “Deprecated”.
If you’re using Nunjucks macros in production with “html” options, or ones ending with “html”, you must sanitise the HTML to protect against cross-site scripting exploits.
Primary options
string |
Required.
The name of the input, which is submitted with the form data.
|
string |
The ID of the input. Defaults to the value of name .
|
string |
Deprecated in 5.7.1
Optional initial value of the input.
|
boolean |
If true , file input will be disabled.
|
boolean |
If true , a user may select multiple files at the same time. The exact mechanism to do this differs depending on operating system.
|
string |
One or more element IDs to add to the aria-describedby attribute, used to provide additional descriptive information for screenreader users.
|
object |
Required.
The label used by the file upload component.
See macro options for label.
|
object |
Can be used to add a hint to the file upload component.
See macro options for hint.
|
object |
Can be used to add an error message to the file upload component. The error message component will not display if you use a falsy value for errorMessage , for example false or null .
See macro options for errorMessage.
|
object |
Additional options for the form group containing the file upload component.
See macro options for formGroup.
|
boolean |
Can be used to enable JavaScript enhancements for the component.
|
string |
The text of the button that opens the file picker. Default is "Choose file" . If javascript is not provided, this option will be ignored.
|
string |
The text informing users they can drop files. Default is "or drop file" . If javascript is not provided, this option will be ignored.
|
object |
The text displayed when multiple files have been chosen by the user. The component will replace the %{count} placeholder with the number of files selected. Our pluralisation rules apply to this macro option. If javascript is not provided, this option will be ignored.
|
string |
The text displayed when no file has been chosen by the user. Default is "No file chosen" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and enters the drop zone. Default is "Entered drop zone" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and leaves the drop zone without dropping. Default is "Left drop zone" . If javascript is not provided, this option will be ignored.
|
string |
Classes to add to the file upload component.
|
object |
HTML attributes (for example data attributes) to add to the file upload component.
|
Options for label
component
string |
Required.
If html is set, this is not required. Text to use within the label. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the label. If html is provided, the text option will be ignored.
|
string |
The value of the for attribute, the ID of the input the label is associated with.
|
boolean |
Whether the label also acts as the heading for the page.
|
string |
Classes to add to the label tag.
|
object |
HTML attributes (for example data attributes) to add to the label tag.
|
Options for hint
component
string |
Required.
If html is set, this is not required. Text to use within the hint. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the hint. If html is provided, the text option will be ignored.
|
string |
Optional ID attribute to add to the hint span tag.
|
string |
Classes to add to the hint span tag.
|
object |
HTML attributes (for example data attributes) to add to the hint span tag.
|
{% from "govuk/components/file-upload/macro.njk" import govukFileUpload %}
{{ govukFileUpload({
id: "file-upload-1",
name: "fileUpload1",
label: {
text: "Upload a file"
}
}) }}
Error messages
Error messages should be styled like this:
<div class="govuk-form-group govuk-form-group--error">
<label class="govuk-label" for="file-upload-1">
Upload a file
</label>
<p id="file-upload-1-error" class="govuk-error-message">
<span class="govuk-visually-hidden">Error:</span> The CSV must be smaller than 2MB
</p>
<input class="govuk-file-upload govuk-file-upload--error" id="file-upload-1" name="fileUpload1" type="file" aria-describedby="file-upload-1-error">
</div>
Nunjucks macro options
Use options to customise the appearance, content and behaviour of a component when using a macro, for example, changing the text.
Some options are required for the macro to work; these are marked as “Required” in the option description. Deprecated options are marked as “Deprecated”.
If you’re using Nunjucks macros in production with “html” options, or ones ending with “html”, you must sanitise the HTML to protect against cross-site scripting exploits.
Primary options
string |
Required.
The name of the input, which is submitted with the form data.
|
string |
The ID of the input. Defaults to the value of name .
|
string |
Deprecated in 5.7.1
Optional initial value of the input.
|
boolean |
If true , file input will be disabled.
|
boolean |
If true , a user may select multiple files at the same time. The exact mechanism to do this differs depending on operating system.
|
string |
One or more element IDs to add to the aria-describedby attribute, used to provide additional descriptive information for screenreader users.
|
object |
Required.
The label used by the file upload component.
See macro options for label.
|
object |
Can be used to add a hint to the file upload component.
See macro options for hint.
|
object |
Can be used to add an error message to the file upload component. The error message component will not display if you use a falsy value for errorMessage , for example false or null .
See macro options for errorMessage.
|
object |
Additional options for the form group containing the file upload component.
See macro options for formGroup.
|
boolean |
Can be used to enable JavaScript enhancements for the component.
|
string |
The text of the button that opens the file picker. Default is "Choose file" . If javascript is not provided, this option will be ignored.
|
string |
The text informing users they can drop files. Default is "or drop file" . If javascript is not provided, this option will be ignored.
|
object |
The text displayed when multiple files have been chosen by the user. The component will replace the %{count} placeholder with the number of files selected. Our pluralisation rules apply to this macro option. If javascript is not provided, this option will be ignored.
|
string |
The text displayed when no file has been chosen by the user. Default is "No file chosen" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and enters the drop zone. Default is "Entered drop zone" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and leaves the drop zone without dropping. Default is "Left drop zone" . If javascript is not provided, this option will be ignored.
|
string |
Classes to add to the file upload component.
|
object |
HTML attributes (for example data attributes) to add to the file upload component.
|
Options for label
component
string |
Required.
If html is set, this is not required. Text to use within the label. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the label. If html is provided, the text option will be ignored.
|
string |
The value of the for attribute, the ID of the input the label is associated with.
|
boolean |
Whether the label also acts as the heading for the page.
|
string |
Classes to add to the label tag.
|
object |
HTML attributes (for example data attributes) to add to the label tag.
|
Options for hint
component
string |
Required.
If html is set, this is not required. Text to use within the hint. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the hint. If html is provided, the text option will be ignored.
|
string |
Optional ID attribute to add to the hint span tag.
|
string |
Classes to add to the hint span tag.
|
object |
HTML attributes (for example data attributes) to add to the hint span tag.
|
{% from "govuk/components/file-upload/macro.njk" import govukFileUpload %}
{{ govukFileUpload({
id: "file-upload-1",
name: "fileUpload1",
label: {
text: "Upload a file"
},
errorMessage: {
text: "The CSV must be smaller than 2MB"
}
}) }}
Make sure errors follow the guidance in the Error message component and have specific error messages for specific error states.
If no file has been selected
Say ‘Select a [whatever they need to select]’.
For example, ‘Select a report’.
If the file is the wrong file type
Say ‘The selected file must be a [list of file types]’.
For example, ‘The selected file must be a CSV or ODS’ or ‘The selected file must be a JPG, BMP, PNG, TIF or PDF’.
If the file is too big
Say ‘The selected file must be smaller than [largest file size]’.
For example, ‘The selected file must be smaller than 2MB’.
If the file is empty
Say ‘The selected file is empty’.
If the file contains a virus
Say ‘The selected file contains a virus’.
If the file is password protected
Say ‘The selected file is password protected’.
If there was a problem and the file was not uploaded
Say ‘The selected file could not be uploaded – try again’.
If there is a limit on how many files the user can select
Say ‘You can only select up to [highest number] files at the same time’.
For example, ‘You can only select up to 10 files at the same time’.
If the file is not in a template that must be used or the template has been changed
Say ‘The selected file must use the template’.
Using the improved File upload component
In March 2025, we introduced changes to the File upload component that service teams can opt in to as part of GOV.UK Frontend 5.9.0.
The improved component is intended to:
- fix accessibility issues
- improve the user experience
- allow text in the component to be translated
We recommend service teams start using the latest component to improve the experience for users. However, it’s a visual change from the previous component and might affect existing designs and layouts.
To let teams migrate at their own pace, the improvements are only enabled if you use the javascript
macro option or extra markup in your HTML.
This example shows you how to enable the improved File upload component:
<div class="govuk-form-group">
<label class="govuk-label" for="file-upload-1">
Upload a file
</label>
<div
class="govuk-drop-zone"
data-module="govuk-file-upload">
<input class="govuk-file-upload" id="file-upload-1" name="fileUpload1" type="file">
</div>
</div>
Nunjucks macro options
Use options to customise the appearance, content and behaviour of a component when using a macro, for example, changing the text.
Some options are required for the macro to work; these are marked as “Required” in the option description. Deprecated options are marked as “Deprecated”.
If you’re using Nunjucks macros in production with “html” options, or ones ending with “html”, you must sanitise the HTML to protect against cross-site scripting exploits.
Primary options
string |
Required.
The name of the input, which is submitted with the form data.
|
string |
The ID of the input. Defaults to the value of name .
|
string |
Deprecated in 5.7.1
Optional initial value of the input.
|
boolean |
If true , file input will be disabled.
|
boolean |
If true , a user may select multiple files at the same time. The exact mechanism to do this differs depending on operating system.
|
string |
One or more element IDs to add to the aria-describedby attribute, used to provide additional descriptive information for screenreader users.
|
object |
Required.
The label used by the file upload component.
See macro options for label.
|
object |
Can be used to add a hint to the file upload component.
See macro options for hint.
|
object |
Can be used to add an error message to the file upload component. The error message component will not display if you use a falsy value for errorMessage , for example false or null .
See macro options for errorMessage.
|
object |
Additional options for the form group containing the file upload component.
See macro options for formGroup.
|
boolean |
Can be used to enable JavaScript enhancements for the component.
|
string |
The text of the button that opens the file picker. Default is "Choose file" . If javascript is not provided, this option will be ignored.
|
string |
The text informing users they can drop files. Default is "or drop file" . If javascript is not provided, this option will be ignored.
|
object |
The text displayed when multiple files have been chosen by the user. The component will replace the %{count} placeholder with the number of files selected. Our pluralisation rules apply to this macro option. If javascript is not provided, this option will be ignored.
|
string |
The text displayed when no file has been chosen by the user. Default is "No file chosen" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and enters the drop zone. Default is "Entered drop zone" . If javascript is not provided, this option will be ignored.
|
string |
The text announced by assistive technology when user drags files and leaves the drop zone without dropping. Default is "Left drop zone" . If javascript is not provided, this option will be ignored.
|
string |
Classes to add to the file upload component.
|
object |
HTML attributes (for example data attributes) to add to the file upload component.
|
Options for label
component
string |
Required.
If html is set, this is not required. Text to use within the label. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the label. If html is provided, the text option will be ignored.
|
string |
The value of the for attribute, the ID of the input the label is associated with.
|
boolean |
Whether the label also acts as the heading for the page.
|
string |
Classes to add to the label tag.
|
object |
HTML attributes (for example data attributes) to add to the label tag.
|
Options for hint
component
string |
Required.
If html is set, this is not required. Text to use within the hint. If html is provided, the text option will be ignored.
|
string |
Required.
If text is set, this is not required. HTML to use within the hint. If html is provided, the text option will be ignored.
|
string |
Optional ID attribute to add to the hint span tag.
|
string |
Classes to add to the hint span tag.
|
object |
HTML attributes (for example data attributes) to add to the hint span tag.
|
{% from "govuk/components/file-upload/macro.njk" import govukFileUpload %}
{{ govukFileUpload({
id: "file-upload-1",
name: "fileUpload1",
label: {
text: "Upload a file"
},
javascript: true
}) }}
Changes in the improved component
To make it easier for users to drag and drop files, we’ve made the drop zone:
- bigger
- visible at all times
- more visually responsive to user interactions
We’ve also changed the ‘Choose file’ button to be more consistent with the secondary button in the Button component.
Service teams can change the text on the button and in the ‘No file chosen’ message. We decided to make this text changeable for translation purposes and to let teams be specific about the file to upload. However, teams should aim to keep the text as short as possible for accessibility purposes. For example, screen reader users might find it difficult to use the component if the text is too long.
All the text in the component can now be translated to match the language of the page content when JavaScript is running.
Improvements for assistive technology users
Users of Dragon, a speech recognition tool, cannot activate their browser’s native file inputs by using commands for interacting with web page controls. They have to rely on mouse commands or keyboard commands, which take multiple steps to activate the component.
With the improved File upload component, users can say commands for interacting with web page controls to choose files.
However, due to browser security features, this may not work on subsequent interactions on the same page. If the component needs to be used more than once (for example, to correct a mistake), users will first need to perform another action, such as a mouse click.
Research on this component
An accessibility audit has shown some users have encountered a problem when using File upload.
Known issues and gaps
The earlier version of the File upload component does not show a visual target area when dragging and dropping a file. The component inherits and uses the browser’s default behaviour. More detail on the findings can be found in the GitHub issue: ‘Upload file component has no visual target area when dragging and dropping a file’.
We revisited this issue in March 2025 and have published an improved File upload component to improve accessibility. Although we’re confident the new component is an improvement on the browser’s default behaviour, teams can continue to use the existing component until the next major release, when the new version will be enabled by default.
To help make sure that this page is useful, relevant and up to date, you can: