JAVA upload attachment to JIRA Issue via REST API by HttpURLConnection method?

Tomáš Pilný July 14, 2017

Hi everyone,

can help me anyone?

I need upload image or other files to JIRA by REST API, but i cant use HttpPost method, because with this method i have problem with company proxy. I tryed this:

public void AddAttachment(String DefectId) throws IOException, JSONException {

String CHARSET = "UTF-8";
BufferedReader br = null;

Authorization();

String path = "C:\\somefile.txt";
File file = new File(path);

URL url = new URL(myServer + "/rest/api/2/issue/" + DefectId + "/attachments");
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy", 8080));
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Cookie", cookieValue);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("X-Atlassian-Token", "nocheck");

System.out.println(conn.getResponseCode());
System.out.println(conn.getResponseMessage());

OutputStream outputStream = conn.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, CHARSET), true);
try ( FileInputStream inputStream = new FileInputStream(file);) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
writer.flush();


if (200 <= conn.getResponseCode() && conn.getResponseCode() <= 299) {
br = new BufferedReader(new InputStreamReader(conn.getInputStream(),
"UTF-8"));
} else {
br = new BufferedReader(new InputStreamReader(conn.getErrorStream(),
"UTF-8"));
}

String lineOfResponse = "";
StringBuilder strBuild = new StringBuilder();

while ((lineOfResponse = br.readLine()) != null) {
strBuild.append(lineOfResponse);
}

String response = strBuild.toString();

System.out.println(response);

conn.disconnect();
br.close();


}

 I have problem how a can id file(image or document) to output stream.

Authorization(by Cookies) i have in other methods and working fine.

2 answers

0 votes
Ashish Agre June 30, 2018

This is how i uploaded properly, dependencies okhttp and okio

private static void upload(File file) throws Exception{
final String address = "https://domain/rest/api/2/issue/issueId/attachments";
final OkHttpClient okHttpClient = new OkHttpClient();
final RequestBody formBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(),
RequestBody.create(MediaType.parse("text/plain"), file))
.build();
final Request request = new Request.Builder().url(address).post(formBody)
.addHeader("X-Atlassian-Token", "no-check")
.addHeader("Authorization", "Basic api_token_from_your_account")
.build();
final Response response = okHttpClient.newCall(request).execute();
System.out.println(response.code() + " => " + response.body().string());
}
Sachintha August 18, 2019

okhttp3 or okhttp dependency?

Abhishek Yadav November 6, 2019

File fileUpload = new File("Path to file");

/* Path to file : In windows- "C:\\Users\\Abhishek\\Downloads\\test.png"

                       In Linux - "/home/dir/test.png"

*/
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost postRequest = new HttpPost(URL);

/*  URL : https//{jira Base Url}/rest/api/2/issue/{issueKey}/attachments

*/

String userpass = "username" + ":" + "Password";
String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
postRequest.setHeader("Authorization", basicAuth);
postRequest.setHeader("X-Atlassian-Token", "nocheck");
MultipartEntityBuilder entity = MultipartEntityBuilder.create();
entity.addPart("file", new FileBody(fileUpload));
postRequest.setEntity(entity.build());

HttpResponse jiraResponse = null;
try {
jiraResponse = httpClient.execute(postRequest);
} catch (ClientProtocolException f) {
f.printStackTrace();
} catch (IOException f) {
f.printStackTrace();
}

if (jiraResponse.getStatusLine().getStatusCode() == 200) {
System.out.println("Adding attachment to JIRA passed");
Files.deleteIfExists(targetPath);
} else {
System.out.println("Adding attachment to JIRA failed");
}

0 votes
Arthur Gonçalves
Atlassian Team
Atlassian Team members are employees working across the company in a wide variety of roles.
May 1, 2018

Hey Tomas,

 

I think that you may implement something similar to the described on the following page:

Does it fit your needing?

 

Regards,
Arthur Gonçalves | Atlassian Support

Suggest an answer

Log in or Sign up to answer