Add attachment
Adds one or more attachments to an issue. Attachments are posted as multipart/form-data (RFC 1867).
Note that:
- The request must have a
X-Atlassian-Token: no-check
header, if not it is blocked. See Special headers for more information. - The name of the multipart/form-data parameter that contains the attachments must be
file
.
The following examples upload a file called myfile.txt to the issue TEST-123:
curl
curl --location --request POST 'https://your-domain.atlassian.net/rest/api/3/issue/TEST-123/attachments'
-u 'email@example.com:<api_token>'
-H 'X-Atlassian-Token: no-check'
--form 'file=@"myfile.txt"'
Node.js
// This code sample uses the 'node-fetch' and 'form-data' libraries:
// https://www.npmjs.com/package/node-fetch
// https://www.npmjs.com/package/form-data
const fetch = require('node-fetch');
const FormData = require('form-data');
const fs = require('fs');
const filePath = 'myfile.txt';
const form = new FormData();
const stats = fs.statSync(filePath);
const fileSizeInBytes = stats.size;
const fileStream = fs.createReadStream(filePath);
form.append('file', fileStream, {knownLength: fileSizeInBytes});
fetch('https://your-domain.atlassian.net/rest/api/3/issue/TEST-123/attachments', {
method: 'POST',
body: form,
headers: {
'Authorization': Basic ${Buffer.from( 'email@example.com:' ).toString('base64')}
,
'Accept': 'application/json',
'X-Atlassian-Token': 'no-check'
}
})
.then(response => {
console.log(
Response: ${response.status} ${response.statusText}
);
return response.text();
})
.then(text => console.log(text))
.catch(err => console.error(err));
Java
// This code sample uses the 'Unirest' library:
// http://unirest.io/java.html
HttpResponse response = Unirest.post("https://your-domain.atlassian.net/rest/api/2/issue/{issueIdOrKey}/attachments")
.basicAuth("email@example.com", "")
.header("Accept", "application/json")
.header("X-Atlassian-Token", "no-check")
.field("file", new File("myfile.txt"))
.asJson();
System.out.println(response.getBody());
Python
This code sample uses the 'requests' library:
http://docs.python-requests.org
import requests
from requests.auth import HTTPBasicAuth
import json
url = "https://your-domain.atlassian.net/rest/api/2/issue/{issueIdOrKey}/attachments"
auth = HTTPBasicAuth("email@example.com", "")
headers = {
"Accept": "application/json",
"X-Atlassian-Token": "no-check"
}
response = requests.request(
"POST",
url,
headers = headers,
auth = auth,
files = {
"file": ("myfile.txt", open("myfile.txt","rb"), "application-type")
}
)
print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")))
PHP
// This code sample uses the 'Unirest' library:
// http://unirest.io/php.html
Unirest\Request::auth('email@example.com', '');
$headers = array(
'Accept' => 'application/json',
'X-Atlassian-Token' => 'no-check'
);
$parameters = array(
'file' => File::add('myfile.txt')
);
response = Unirest\Request::post(
'https://your-domain.atlassian.net/rest/api/2/issue/{issueIdOrKey}/attachments',
headers,
$parameters
);
var_dump($response)
Forge
// This sample uses Atlassian Forge and the form-data
library.
// https://developer.atlassian.com/platform/forge/
// https://www.npmjs.com/package/form-data
import api from "@forge/api";
import FormData from "form-data";
const form = new FormData();
form.append('file', fileStream, {knownLength: fileSizeInBytes});
const response = await api.asApp().requestJira('/rest/api/2/issue/{issueIdOrKey}/attachments', {
method: 'POST',
body: form,
headers: {
'Accept': 'application/json',
'X-Atlassian-Token': 'no-check'
}
});
console.log(Response: ${response.status} ${response.statusText}
);
console.log(await response.json());
Tip: Use a client library. Many client libraries have classes for handling multipart POST operations. For example, in Java, the Apache HTTP Components library provides a MultiPartEntity class for multipart POST operations.
This operation can be accessed anonymously.
Permissions required:
- Browse Projects and Create attachments project permission for the project that the issue is in.
- If issue-level security is configured, issue-level security permission to view the issue.
curl --location --request POST 'http://jira.local:8080/jira/rest//rest/api/3/issue//attachments'
[
{
"self": "https://your-domain.atlassian.net/rest/api/3/attachments/10000",
"id": "10001",
"filename": "picture.jpg",
"author": {
"self": "https://your-domain.atlassian.net/rest/api/3/user?accountId=5b10a2844c20165700ede21g",
"accountId": "5b10a2844c20165700ede21g",
"emailAddress": "mia@example.com",
"avatarUrls": {
"48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48",
"24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24",
"16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16",
"32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32"
},
"displayName": "Mia Krystof",
"active": true,
"timeZone": "Australia/Sydney"
},
"created": "2023-07-12T06:03:08.341+0000",
"size": 23123,
"mimeType": "image/jpeg",
"content": "https://your-domain.atlassian.net/rest/api/3/attachment/content/10000",
"thumbnail": "https://your-domain.atlassian.net/rest/api/3/attachment/thumbnail/10000"
},
{
"self": "https://your-domain.atlassian.net/rest/api/3/attachments/10001",
"filename": "dbeuglog.txt",
"author": {
"self": "https://your-domain.atlassian.net/rest/api/3/user?accountId=5b10a2844c20165700ede21g",
"accountId": "5b10a2844c20165700ede21g",
"emailAddress": "mia@example.com",
"avatarUrls": {
"48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48",
"24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24",
"16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16",
"32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32"
},
"displayName": "Mia Krystof",
"active": true,
"timeZone": "Australia/Sydney"
},
"created": "2023-07-12T06:03:08.341+0000",
"size": 2460,
"mimeType": "text/plain",
"content": "https://your-domain.atlassian.net/rest/api/3/attachment/content/10001"
}
]