1. Overview
File Field for Jira – Attachment & Document Custom Fields
adds a dedicated file-upload custom field to Jira issues and Jira Service
Management request forms — separate from Jira’s single built-in
attachment box, with rules you control.
Create as many fields as you need, each with its own allowed file types, size and
count limits, and its own choice of storage mode. A field’s configuration
lives with the field itself, so a “Design assets” field and a
“Signed contract” field on the same issue type can enforce completely
different rules.
At a glance
| Hosting | Jira Cloud — Software and Service Management. There is no Server or Data Center version. |
| Vendor | Contextra Labs |
| Built with | Atlassian Forge, Custom UI |
| Appears on | Issue view, issue create, issue transition screens, and JSM portal request forms |
| Data residency | No external domains declared. Portable-mode file bytes are ordinary Jira attachments; Private-mode file bytes live in Forge Object Storage — both operated by Atlassian, not a third party |
Where the field's own settings live:
configuration is per field, reached from Jira admin — not from the issue
itself. See section 6.
2. Prerequisites
| Requirement | Why |
| Jira Cloud (Software or Service Management) | The app is a Forge app and runs on Cloud only. |
| An active licence or evaluation | Without one, the field stops accepting new uploads, removals and configuration changes. Files already stored remain visible and downloadable — an inactive licence never hides or deletes your existing content. |
| Jira admin access | Needed once, to create the custom field and add it to screens, contexts and work-type layouts. |
| Permission to edit the issue | Needed to add or remove files day to day — the field uses Jira’s own issue-edit permission, not a separate one of its own. |
3. Installation
- Open the app’s listing on the Atlassian Marketplace.
- Click Try it free (or Get it now) and choose the Jira site to install on.
- Confirm the requested permissions. They are listed in full in section 5.
-
Wait for the install to complete. Nothing appears on any issue yet
— the field itself does not exist until you create one, which is a separate
step. See section 4.
4. Creating the Field
Installing the app adds a new custom field type to Jira — it does not
add a field to any issue by itself. Creating and placing an actual field takes the
same admin chain as any Jira custom field, plus one extra step on team-managed
projects that is easy to miss.
1
Create the field
Jira Settings (the gear icon) → Issues → Custom fields → Create custom field. Search for File Field, select it, name it, and create it.
2
Classic projects: field scheme and screen
Add the new field to a Field Scheme used by your project, and to a Screen used by the issue types you want it on. This is the same chain any classic-project custom field goes through.
3
Team-managed projects: the project’s own field list
Team-managed projects keep a separate field list. Go to Project settings → Fields → Add field and add File Field there too — creating the field site-wide is not enough on its own.
4
Team-managed projects: each work type’s layout
Project settings → Work types → [the issue type] → drag the field into the Context fields area, then Save. Repeat for every work type that should show the field.
Skipping either team-managed step (3 or 4) leaves the field entirely
invisible on issues of that type, with no error message anywhere. If a
field you created does not appear on an issue, check the project’s own field
list and that specific work type’s layout before assuming something is
broken.
Where the field appears
| Surface | What it does |
| Issue view, create and transition screens | The field’s edit view — add and remove files, subject to the field’s rules. |
| JSM portal request form and portal view | The same field and the same rules, for requesters and agents. See section 9. |
| Field configuration screen | Jira Settings → Issues → Custom fields → [field name] →
Screens and contexts → [context] → Configure custom field.
Not linked from anywhere on the issue itself — this is the only path to it.
|
5. Permissions
The app requests six scopes, and no others:
| Scope | Why it is needed |
read:attachment:jira | Read attachment metadata for the ownership check, and content for the server-side spoof re-check |
write:attachment:jira | Create attachments when a file is uploaded to a Portable-mode field |
delete:attachment:jira | Roll back a rejected upload, and honour file removal |
read:jira-work | Read the issue’s attachment list, and re-verify the calling user’s own Jira permission before returning a field’s files |
write:jira-work | Not granular — required because Jira’s legacy attachment-upload endpoint isn’t fully covered by the granular write:attachment:jira scope alone |
storage:app | Persist per-field configuration (storage mode, rules) |
Five of six scopes are granular. write:jira-work is the one exception, and it is a platform gap rather
than a design choice — Jira’s legacy attachment-upload endpoint is not
yet fully covered by the narrower write:attachment:jira scope on its
own.
Runs on Atlassian
The app declares no external domains and makes no network request
to any third party. Portable-mode file bytes are ordinary Jira attachments; Private-mode
file bytes live in Forge Object Storage — a store Atlassian operates on the
app’s behalf, not a service Contextra Labs runs.
6. Configuration
Open the field’s configuration screen (see section 4).
Configuration is per field — two File Field custom fields on the same issue can
carry completely different rules.
Storage mode
Choose one of two radio options. The tradeoff is stated on the screen itself, not left to the documentation:
Portable — real Jira attachments. Files are stored as real Jira attachments. They survive if this app is ever uninstalled, and are visible in Jira's native attachment panel to anyone who can view the issue — per-field view permissions cannot be enforced in this mode. Files can only be added once the item exists, not during creation.
Private — hidden from Jira's attachments. Files are stored in this app's own storage, completely separate from Jira's native attachments — they never appear in Jira's Attachment panel, attachment lists, or any integration that reads native attachments, and unlike Portable mode they can be added while the item is still being created. They do NOT survive if this app is ever uninstalled (an export tool is provided to mitigate this). Per-field restriction by group or project role is not supported — anyone who can open this field can access its files.
Panel wording, reproduced — not a screenshot.
On that last sentence. Neither storage mode restricts who can
access a field's files beyond Jira's own issue-view permission — Private mode hides
files from Jira's attachment panel, but it is not a per-field access-control
feature. Download the files you need, or export the whole field as a ZIP (see
section 8), before you uninstall a field configured for
Private mode.
Limits
| Field | Default | What it does |
| Minimum files | 0 | How many files must be present before the field is considered complete. |
| Maximum files | 20 | The most files this field will hold. |
| Max size per file (MB) | 10 | Applied per file, not to the field’s total. |
Allowed file types
“Leave every box unchecked to allow any file type.” Four categories are offered:
| Category | Covers |
| Images | PNG, JPG, GIF, SVG, WebP |
| Documents | PDF, Word, text |
| Spreadsheets | Excel, CSV |
| Archives | ZIP, TAR, 7z |
These decide what an admin can restrict a field to, not the security
boundary by itself — every upload is also checked that its content actually
matches its claimed extension, regardless of category. See section 10.
Preview
“Show inline previews for images and PDFs” — on by
default. When off, every file downloads instead of previewing, even images.
Test your rules
A separate, visually distinct panel below Save. It does not change the field’s
configuration — it only answers a question about it.
Test your rules. Check whether a hypothetical file would be accepted, without uploading anything.
File name · MIME type · Size (bytes) — then Test.
Result: “This file would be accepted.”, or the same rejection reason a real upload would get.
Panel wording, reproduced — not a screenshot.
This is the fastest way to check a size or type rule without needing to construct a
real oversized or disallowed file — used in the walkthrough in
section 10.
7. Uploading & Managing Files
On an issue with the field, or on a JSM request form, the edit view shows every file
already attached, an Add file button, and — while the field is
empty — a one-line summary of its active rules, for example:
Any file type · up to 20 files · max 10.0 MB each
Panel wording, reproduced — not a screenshot.
- Click Add file (or Add files, if more than one is allowed) and choose one or more files.
- Each file is checked against the field’s rules before anything is sent over the network. A file that fails shows its rejection reason immediately, with a Dismiss button.
- A file that passes uploads with a progress spinner next to its name, then joins the list with its size shown alongside.
- Click Remove next to any file to take it out of the field.
A rejected upload, reproduced
File is 12.4 MB, exceeding the 10.0 MB limit for this field.
Panel wording, reproduced — not a screenshot.
In Portable mode, the edit
view also carries a standing notice: “Files in this field are stored as
regular Jira attachments, visible to anyone who can view this issue. Per-field view
permissions are not supported in either storage mode — anyone who can open this
field can access its files.” It is not an error — it stays visible
because it is genuinely true for as long as the field is in that mode.
If the licence or evaluation is inactive, the field becomes read-only: “An
active licence is required to add or remove files. Existing files remain visible and
downloadable.”
8. Viewing & Downloading
Anyone who can view the issue sees the field’s read-only view: a list of file
names and sizes, or “No files attached.” if the field is empty.
- Click any file name to open it.
- Images open in an inline preview dialog, if previews are enabled for the field.
- Every other file type downloads immediately with one click.
- Click Download all as ZIP, shown whenever the field has files, to bulk-export every file in the field into a single archive — works in either storage mode.
If a file was removed directly in Jira — outside this field, for example
through Jira’s own attachment panel in Portable mode — it stays listed
with its name struck through and labelled “Removed in Jira”, and
a notice appears: “Some files were removed directly in Jira and are no
longer available through this field.”
9. JSM Portal Requests
A File Field added to a Jira Service Management request type appears on the
portal request form for requesters, using the exact same rules
configured for the field — the same allowed types, size and count limits, and
the same storage mode. Agents see the same field, with the same read-only view
described in section 8, on the portal’s request view.
There is nothing JSM-specific to configure: a field behaves identically whether it is
reached from the Jira issue view or from a customer-facing portal.
10. Sample Test Files
Three small files for validating a field’s upload rules end to end, plus one
rule you can test without uploading anything at all.
filefield-sample-document.pdf
A small, valid PDF. Falls in the Documents category.
Download filefield-sample-image.png
A small, valid PNG. Falls in the Images category and previews inline.
Download filefield-sample-image-renamed.pdf
The exact same PNG bytes as above, renamed with a .pdf extension — deliberately, to demonstrate the spoof check.
Download Step 1 — restrict the field to Documents
In the field’s configuration (section 6), check only
Documents under Allowed file types, leave Max size per file at its
10 MB default, and Save.
Step 2 — upload the sample PDF
On an issue carrying the field, click Add file and choose
filefield-sample-document.pdf. It should upload and appear in the list.
Step 3 — upload the sample PNG (expect a rejection)
Try filefield-sample-image.png next. Since only Documents are allowed,
it should be rejected immediately, before any network request:
".png" files are not allowed in this field. Accepted: doc, docx, odt, pdf, txt.
Panel wording, reproduced — not a screenshot.
Step 4 — allow Images too, then retry
Back in configuration, check Images alongside Documents and Save.
Upload filefield-sample-image.png again — it should now be
accepted, and clicking it in the field’s view should open an inline preview
rather than a download.
Step 5 — the renamed file (expect a spoof rejection)
Upload filefield-sample-image-renamed.pdf. Its bytes are a PNG, but its
extension claims .pdf. Extension and category checks pass — PDF is
an allowed Document — but the content check catches the mismatch:
The file's content does not match its .pdf extension. This can happen if a file was renamed — please upload the original file.
Panel wording, reproduced — not a screenshot.
Step 6 — the size rule, with no file at all
Use Test your rules in configuration instead of constructing a large
file. Enter file name scan.pdf, MIME type application/pdf,
size 15000000 (roughly 15 MB) against the 10 MB default, and
click Test:
File is 14.3 MB, exceeding the 10.0 MB limit for this field.
Panel wording, reproduced — not a screenshot.
Expected results
| File / test | Rule exercised | Expected result |
| filefield-sample-document.pdf | Category restricted to Documents | Accepted |
| filefield-sample-image.png, before Step 4 | Category restricted to Documents | Rejected — type not allowed |
| filefield-sample-image.png, after Step 4 | Category widened to Documents + Images | Accepted, previews inline |
| filefield-sample-image-renamed.pdf | Server-side content-vs-extension check | Rejected — content does not match extension |
| Test your rules: scan.pdf, 15,000,000 bytes | Max size per file | Reported as rejected, exceeding the 10.0 MB limit |
Worth noting for the third row: the spoof check compares file bytes against
signatures it recognises, then compares that against the claimed extension. A
renamed text file is not caught this way — there is no known
signature to disagree with — which is why this walkthrough uses a renamed
binary image instead.
11. Storage Modes In Depth
| Portable | Private |
| File bytes stored in | Jira’s own attachment storage | Forge Object Storage (this app’s bucket) |
| Survives uninstall | Yes | No — download first |
| Visible in Jira’s native attachment panel | Yes | No |
| Per-field view permission | Not enforceable | Not enforceable |
| Who can see a file | Anyone who can view the issue | Anyone who can view the issue |
| Works before the issue exists | No | Yes |
| Upload path | Browser directly to Jira’s attachment API | Browser directly to a time-limited, signed upload URL |
Neither mode is a general recommendation over the other, and neither restricts who
can access a file beyond Jira’s own issue-view permission — Portable
suits files that should behave exactly like any other Jira attachment; Private suits
files that need to stay isolated from Jira’s own attachment integrations, or
that must be added before the issue exists.
12. Limitations
These are published rather than buried, because finding them after paying is worse for everyone.
Private-mode files do not survive an uninstall
This is the deliberate tradeoff for storage isolated from Jira’s own attachments, not a bug. Use Download all as ZIP from the field’s view, or download files individually, before you uninstall.
Neither storage mode restricts who can see a file
Anyone who can view the issue can see a field’s files, in both Portable and Private mode. Private mode hides files from Jira’s native attachment panel, but it does not add any per-field access restriction — it is isolation from Jira’s own attachment storage and integrations, not an access-control feature.
One permission is not granular
write:jira-work is required alongside the granular attachment scopes because Jira’s legacy attachment-upload endpoint is not yet fully covered by the narrower scope on its own — a platform gap, not a design choice.
Requiring a file before a workflow transition is not available yet
The underlying check exists in the app but is not yet enabled, pending further verification. A field can still be placed on a transition screen — it just cannot yet block the transition if empty.
Office and OpenDocument formats share one outer signature
.docx, .xlsx, .pptx, .odt, .ods and a plain .zip are all built on the same underlying ZIP container, so the content check can confirm a file is genuinely one of these six formats, but cannot tell which one from the bytes alone. It can still catch a file spoofed as an unrelated type, such as a PNG renamed to any of these.
13. Troubleshooting
| What you see | Why | What to do |
| An active licence is required to add or remove files. Existing files remain visible and downloadable. | The licence or evaluation is inactive. | Renew or start an evaluation from the Marketplace listing. Nothing already stored is affected. |
| Could not identify this issue. Try refreshing the page. | The field loaded without full page context, usually a stale tab. | Refresh the page and try again. |
| Uploaded to Jira, but saving the field failed: … | The file itself reached Jira as an attachment, but the field’s own value failed to save. | Refresh and check whether the file is listed. If not, remove the orphaned attachment in Jira and retry the upload. |
| The file's content does not match its extension… | The uploaded file’s bytes don’t match the extension it was given — typically a renamed file. | Upload the original, unrenamed file. |
| File is …, exceeding the … limit for this field. | The file is larger than the field’s configured maximum size. | Use a smaller file, or ask an admin to raise “Max size per file” in configuration. |
| … files are not allowed in this field. Accepted: … | The file’s type is outside the field’s Allowed file types. | Use an accepted type, or ask an admin to widen the allowed categories. |
| Some files were removed directly in Jira and are no longer available through this field. | Someone deleted the underlying Jira attachment outside this field (Portable mode only). | Expected behaviour, not an error. Remove the stale reference or re-upload the file. |
| No files attached. | The field has never had a file added on this issue. | Not an error — add a file if one is expected. |
14. Support
When reporting a problem with a specific field, the most useful details are the
field’s name, its configured storage mode, and the exact message it showed.