Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Get Attachments through REST API

Aruna Sree Yela
Tera Guru

Hi,

 

3rd party tool is calling servicenow to get attachments of RITM in binary stream.

 

I want to achieve this using script include and Scripted REST API. How to achieve this

 

Thanks

1 ACCEPTED SOLUTION

@Aruna Sree Yela 

I am able to get the base64 data using background script in global scope

You can check the script and enhance

I believe if the base64 string is huge then it might not work while setting the response of scripted rest api

var attGr = new GlideRecord('sys_attachment');
  attGr.addQuery('sys_id', 'b45f80356f102100758ecb512e3ee485');
  attGr.query();
  if(attGr.next())
        {
   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 attachmentData = gsa.getBytes(attGr);
   var attachment = String(Packages.java.lang.String(attachmentData));
   gs.info(attachment); //the data in the file will be printed as String
   var encData = GlideStringUtil.base64Encode(attachmentData); // data of one attachment at a time
   gs.info(encData);
}

Output:

AnkurBawiskar_0-1739272573205.png

 

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

20 REPLIES 20

@Ankur Bawiskar ,yes tried, not getting any value

@Aruna Sree Yela 

I am able to get the base64 data using background script in global scope

You can check the script and enhance

I believe if the base64 string is huge then it might not work while setting the response of scripted rest api

var attGr = new GlideRecord('sys_attachment');
  attGr.addQuery('sys_id', 'b45f80356f102100758ecb512e3ee485');
  attGr.query();
  if(attGr.next())
        {
   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 attachmentData = gsa.getBytes(attGr);
   var attachment = String(Packages.java.lang.String(attachmentData));
   gs.info(attachment); //the data in the file will be printed as String
   var encData = GlideStringUtil.base64Encode(attachmentData); // data of one attachment at a time
   gs.info(encData);
}

Output:

AnkurBawiskar_0-1739272573205.png

 

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 Bawiskar ,

 

When I try with files of size 96-100mb, we are not getting the base64. How can we achieve that.

 

Thanks

@Aruna Sree Yela 

it has a limitation for file size of 5MB

check this if it works, I haven't tested for huge file size such as 90MB or so

var gr = new GlideRecord('sys_attachment');
	gr.get('d7ff2c044f96cc90fc11fa218110c746');

	var StringUtil = new GlideStringUtil();
	var gsis = GlideSysAttachmentInputStream(gr.sys_id.toString());
	var ba = new Packages.java.io.ByteArrayOutputStream();
	gsis.writeTo(ba,0,0);
	ba.close();
	var base64EncodedData = StringUtil.base64Encode(ba.toByteArray());
gs.info(base64EncodedData);

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

@Ankur Bawiskar , getting Out Of Memory error. Don't we have other option for large files?