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

Hi Ankur,

 

Now, duplicates files are not getting attached .when i attached the first doc ex:test.doc, it got attached on other end as test.doc but when i attached the second document as ex:book1.xlsx, again instead of book1.xlsx,test.doc is getting attached. That is the only one issue we have right now. Please help to fix that

 

Wrote business rule on sys_attachment after insert

 

Below code:

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('sys_attachment');
gR.addEncodedQuery('table_name=incident^table_sys_id='+current.table_sys_id);
gR.query();
if(gR.next()){
try {
var binData =   attachments.getBytes(gR);
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', gR.file_name+':'+gR.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();


}


}

@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

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();


}


}