Send attachment from incident table from one instance to other instance

Neethi2
Tera Expert

I want to send the attachment from one instance to another instance, but it is not working

 

End point:https://instance_name.service-now.com/api/now/table/ecc_queue

Payload:{
"source":"staging_table:${snow_source}",
"name":"${snow_fileName}",
"agent":"${snow_agent}",
"topic":"${snow_topic}",
"payload":"${snow_payload}"
}

Business rule:

(function executeRule(current, previous /*null when async*/) {
var gr = new GlideRecord('sys_attachment');
    gr.addQuery('table_sys_id', current.sys_id);
    gr.query();

    while (gr.next()) {
        var fileName = gr.getValue('file_name');
        var contentType = gr.getValue('content_type');
       
        var attachmentSysId = gr.getUniqueValue();
        var attachmentBytes = GlideSysAttachment.getBytes(attachmentSysId);

        // Encode attachment data to Base64
        var StringUtil = new GlideStringUtil();
        var base64EncodedData = StringUtil.base64Encode(attachmentBytes);
       
    var r = new sn_ws.RESTMessageV2('EDOH','Create_Attachment');
r.setStringParameter('snow_agent', 'AttachmentCreator');
 r.setStringParameter('snow_source', current.u_tracking_id);
 r.setStringParameter('snow_topic', 'AttachmentCreator');
  r.setStringParameter('snow_payload',base64EncodedData);
    r.setStringParameter('snow_filename',fileName);
    r.setRequestHeader('Content-Type',contentType);
   
    var response = r.execute();
    var responseBody =response.getBody();
    gs.log("Not working"+responseBody);
    var prsData=JSON.parse(responseBody);
   
   
    var httpStatus= response.getStatusCode();
    gs.log("Attachment Code "+httpStatus);
   
    }

})(current, previous);
 
Note:When i attach the attachment, nothing is happening. Please help to fix this issue
2 ACCEPTED SOLUTIONS

@Neethi2 

update as this, no need to use GlideRecord again on sys_attachment as you can directly pick the current object

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
try {
    var binData = attachments.getBytes(current);
    var encData = StringUtil.base64Encode(binData);
    var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
    s.setStringParameter('snow_source', current.table_sys_id);
    s.setStringParameter('snow_payload', encData);
    s.setStringParameter('snow_topic', 'AttachmentCreator');
    s.setStringParameter('snow_agent', 'AttachmentCreator');
    s.setStringParameter('snow_fileName', current.file_name + ':' + current.content_type);
    var response2 = s.execute();
    var responseBody2 = response2.getBody();
    gs.log("Create Attachment" + responseBody2);
    var status = response2.getStatusCode();
    gs.log("Create Attachment" + status);

} catch (ex) {
    var message1 = ex.getMessage();
}

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

View solution in original post

Neethi2
Tera Expert

Hi Ankur,

Thanks for your help. 

Finally with sys_attachment after insert with below code is working fine as expected,

Condition:current.table_name == 'incident'

 

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('incident');
gR.addEncodedQuery('sys_id='+current.table_sys_id);
gR.query();
if(gR.next()){
try {
var binData =   attachments.getBytes(current);
var encData =   StringUtil.base64Encode(binData);
var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
s.setStringParameter('snow_source',current.table_sys_id);
s.setStringParameter('snow_payload', encData);
s.setStringParameter('snow_topic', 'AttachmentCreator');
s.setStringParameter('snow_agent', 'AttachmentCreator');
s.setStringParameter('snow_fileName', current.file_name+':'+current.content_type);
var response2 = s.execute();
var responseBody2 = response2.getBody();
gs.log("Create Attachment" + responseBody2);
var status = response2.getStatusCode();
gs.log("Create Attachment" +status);

}


catch(ex) {


var message1 = ex.getMessage();


}


}

View solution in original post

8 REPLIES 8

Neethi2
Tera Expert

Can someone please assist here asap. This is very urgent

Ankur Bawiskar
Tera Patron
Tera Patron

@Neethi2 

you want to transfer files between instances right?

if yes then check these links and it has working solution

Unable to send attachment via REST 

Business rule to send attachment to 3rd Party Tool via REST 

Send attachment via rest message 

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

Hi Ankur,

 

It is working when i attach the attachment to the incident,the same gets attached to the another instance. But the issue here is when i attach another attachment  or when i update the incident, it is sending the attachment again to the another instance. I have written the below code to validate the existing attachments but still not working

Please review the code and help me

Business Rule : After Update

var checkIncident = new sn_ws.RESTMessageV2('EDOH', 'Update_Attachment');
        checkIncident.setStringParameterNoEscape('table_sys_id', current.sys_id);
        var checkResponse = checkIncident.execute();
        var checkResponseBody = checkResponse.getBody();
        var checkHttpStatus = checkResponse.getStatusCode();
        gs.log("good log" + checkResponseBody);
        gs.addInfoMessage("Get Attachment response status: " + checkHttpStatus);
        var existingAttachments = JSON.parse(checkResponseBody).result;
        var existingAttachmentNames = [];

        for (var i = 0; i < existingAttachments.length; i++) {
            if (existingAttachments[i].table_sys_id == current.sys_id.toString()) {
                existingAttachmentNames.push(existingAttachments[i].gR.file_name);
            }
        }

 var parser = new JSONParser();
        var parsed = parser.parse(responseBody);
        var targetRec = parsed.result;
        var attachmentCount = sendAttachments(current.getTableName(), current.sys_id, targetRec.sys_id, existingAttachmentNames);
        if (attachmentCount.length > 0) {
            attachmentMsg = " Attachments successfully sent: " + attachmentCount[0] + ". Attachments failed to be sent: " + attachmentCount[1];
        } else {
            attachmentMsg = " Record had no new attachments to send.";
        }
    } else {
        gs.addInfoMessage('Failed');
    }


answer = answer + attachmentMsg;



// Set message at top of screen with results.


gs.addInfoMessage(answer);



function sendAttachments(sourceTable, sourceID, targetID) {


       var answer = [0, 0]; //successful attachments, failed attachments


       


       // Query for any attachments on the current record.


       var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('sys_attachment');

       gR.addQuery("table_sys_id", sourceID);


       gR.addQuery("table_name", sourceTable);
gR.query();


       if (gR.hasNext()) {


               while (gR.next()) {


                       var binData =   attachments.getBytes(gR);
var encData =   StringUtil.base64Encode(binData);
var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
s.setStringParameter('snow_source',current.sys_id);
s.setStringParameter('snow_payload', encData);
s.setStringParameter('snow_topic', 'AttachmentCreator');
s.setStringParameter('snow_agent', 'AttachmentCreator');
s.setStringParameter('snow_fileName', gR.file_name+':'+gR.content_type);


                       //s.setRequestBodyFromAttachment(gR.sys_id);



                       var response = s.execute();


                       var responseBody = response.getBody();


                       var httpStatus = response.getStatusCode();

gs.addInfoMessage("Attachment Code update:"+httpStatus);
gs.log("Attachment updation log" +responseBody);

                       if (httpStatus.toString() == "201") {


                               answer[0] += 1;


                       } else {


                               answer[1] += 1;


                       }


               }


       } else {


               answer = "none";


       }


       return answer;

@Neethi2 

send the files for the 1st time when incident is created via after insert business rule on incident.

From next time onwards when new file is added have after insert BR on sys_attachment table

condition: current.table_name == 'incident'

Script:

// your logic of RestMessage

If my response helped please mark it correct and close the thread so that it benefits future readers.

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