Sending attachment from ServiceNow to Jira using BR and REST message

Shalika
Tera Expert

I want to send attachment from ServiceNow to Jira. For that I have created REST message and BR. I don't know what is wrong with my BR. I am not able to send attachment

(function executeRule(current, previous /*null when async*/ ) {
  var included_tables = ["incident"];
var debug = true;

var arrayUtil = new ArrayUtil();
var requestBody;
var responseBody;
var status;
var sm;

    if (typeof GlideStringUtil != 'undefined')
        var StringUtil = GlideStringUtil;
    else
        var StringUtil = Packages.com.glide.util.StringUtil;
gs.log("initialize");

    var gr = new GlideRecord(current.table_name);
    gr.addQuery('sys_id', current.table_sys_id);
    gr.query();

    if (gr.next()) {
        if (arrayUtil.contains(included_tables,current.table_name)) {
            
            try{
                
        sm = new sn_ws.RESTMessageV2('Neste Siili JIRA', 'Add attachment');
       
                var attachmentsJson = '';
                attachmentsJson += ' { "content_type":"' + current.content_type + '",';
                attachmentsJson += '"file_name":"' + JSUtil.escapeText(current.file_name) + '",';
                attachmentsJson += '"size_bytes":"' + current.size_bytes + '",';
                attachmentsJson += '"sys_id":"' + current.sys_id + '"';
                attachmentsJson += '}';

                sm.setStringParameterNoEscape('attachments', attachmentsJson);

                response = sm.execute();
                status = response.getStatusCode();

            if (debug){
                    gs.log("Payload sent jira: " + sm.getRequestBody());
                    gs.log("Response jira: " + response.getBody());
                    gs.log("Status jira : " + status);
            }
            } catch(ex) {
                responseBody = ex.getMessage();
                status = '500';
            } finally {
                requestBody = sm ? sm.getRequestBody():null;
            }
        }
    }

})(current, previous);

1 ACCEPTED SOLUTION

Hi,

I am sharing a sample code and you can enhance it further

based on BR is on which table sys_attachment or incident enhance the code

var arr = [];

var gsu = (typeof GlideStringUtil != 'undefined') ? (GlideStringUtil) : (Packages.com.glide.util.StringUtil); //few versions support the first one, other supports second
var gsa = (typeof GlideSysAttachment != 'undefined') ? (new GlideSysAttachment()) : (new Packages.com.glide.ui.SysAttachment());

var gr = new GlideRecord("sys_attachment");
gr.addQuery("table_sys_id", incidentSysId);
gr.query();
while (gr.next()) {

	var attachmentData = gsa.getBytes(gr);
	var attachment = String(Packages.java.lang.String(attachmentData));

	var encData = GlideStringUtil.base64Encode(attachmentData);

	var obj = {};
	obj["content_type"] = gr.getValue('content_type');
	obj["file_name"] = JSUtil.escapeText(gr.getValue('file_name'));
	obj["size_bytes"] = gr.getValue("size_bytes ");
	obj["sys_id"] = gr.getUniqueValue();
	obj["Content-Transfer-Encoding"] = "base64" +  encData.toString();

	arr.push(obj);

}

var finalObj = {};
finalObj["attachment"] = arr;

var sm = new sn_ws.RESTMessageV2('Neste Siili JIRA', 'Add attachment');

var response = sm.execute();
var status = response.getStatusCode();

gs.info("Payload sent jira: " + sm.getRequestBody());
gs.info("Response jira: " + response.getBody());
gs.info("Status jira : " + status);

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

View solution in original post

24 REPLIES 24

Hi,

Did you try sending 1 file?

The request body shared doesn't mention about base64 data for the file then how the file data will be transferred?

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

The request body is as follows -

{
      "attachments": [{
          "content_type": "image/png",
          "file_name": "Screenshot (153).png",
                "size_bytes ": "137246 ",
          "sys_id": "f576b5211b091950f7b82fcde54bcbae",
"Content-Transfer-Encoding": "base64${base64EncodedData}"
      }]
  }

 

then are you sending the request body in similar manner?

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Yes they are sending the request body in similar manner.

What should I do or make changes in my code so that the attachment gets reflected in Jira

Hi,

I am sharing a sample code and you can enhance it further

based on BR is on which table sys_attachment or incident enhance the code

var arr = [];

var gsu = (typeof GlideStringUtil != 'undefined') ? (GlideStringUtil) : (Packages.com.glide.util.StringUtil); //few versions support the first one, other supports second
var gsa = (typeof GlideSysAttachment != 'undefined') ? (new GlideSysAttachment()) : (new Packages.com.glide.ui.SysAttachment());

var gr = new GlideRecord("sys_attachment");
gr.addQuery("table_sys_id", incidentSysId);
gr.query();
while (gr.next()) {

	var attachmentData = gsa.getBytes(gr);
	var attachment = String(Packages.java.lang.String(attachmentData));

	var encData = GlideStringUtil.base64Encode(attachmentData);

	var obj = {};
	obj["content_type"] = gr.getValue('content_type');
	obj["file_name"] = JSUtil.escapeText(gr.getValue('file_name'));
	obj["size_bytes"] = gr.getValue("size_bytes ");
	obj["sys_id"] = gr.getUniqueValue();
	obj["Content-Transfer-Encoding"] = "base64" +  encData.toString();

	arr.push(obj);

}

var finalObj = {};
finalObj["attachment"] = arr;

var sm = new sn_ws.RESTMessageV2('Neste Siili JIRA', 'Add attachment');

var response = sm.execute();
var status = response.getStatusCode();

gs.info("Payload sent jira: " + sm.getRequestBody());
gs.info("Response jira: " + response.getBody());
gs.info("Status jira : " + status);

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader