We're reclaiming inactive PDIs to keep them available for active builders. Learn what's changing, who's affected, and how to protect your work. Read More

write() function of GlideSysAttachment() not working

Saquib Mohammed
Mega Guru

I have written below script as a Scripted REST resouce in Global scope. However, the write function doesnt work

var queryParamsVar = request.queryParams;
var attachment = new GlideSysAttachment();
var correlationId = queryParamsVar.CorrelationId[0];
var grIncTask = new GlideRecord('incident_task');
grIncTask.addQuery('correlation_id', correlationId);
grIncTask.query();

var fileName = queryParamsVar.FileName[0];
var contentType = queryParamsVar.ContentType[0];
var base64Encodedcontent = queryParamsVar.Base64Enc[0];
var decodedBytes = GlideStringUtil.base64DecodeAsBytes(base64Encodedcontent);
var arg = attachment.write(grIncTask, fileName, contentType, decodedBytes);
gs.info('This is a log for attachment sys_id is: ' + agr);

 

In the system logs, I see the below error - 

*** Script: undefined: no thrown error

and

getEventTarget() called with invalid record reference: sys_poll. for event: appsec.security.export, could have been deleted

I was trying to use writeBase64 but later found that it can used only for scoped applications. So I tried with write function but this is not doing the job either.

1 ACCEPTED SOLUTION

@Saquib Mohammed 

small update

var queryParamsVar = request.queryParams;
var attachment = new GlideSysAttachment();
var correlationId = queryParamsVar.CorrelationId[0];
var grIncTask = new GlideRecord('incident_task');
grIncTask.addQuery('correlation_id', correlationId);
grIncTask.query();
grIncTask.next(); // added now

var fileName = queryParamsVar.FileName[0];
var contentType = queryParamsVar.ContentType[0];
var base64Encodedcontent = queryParamsVar.Base64Enc[0];

var eccGr = new GlideRecord('ecc_queue');
eccGr.initialize();
eccGr.setValue('agent', 'AttachmentCreator');
eccGr.setValue('topic', 'AttachmentCreator');
eccGr.setValue('name', fileName + ':' + contentType);
eccGr.setValue('source', grIncTask.getTableName() + ':' + grIncTask.getUniqueValue());
eccGr.setValue('payload', base64Encodedcontent);
eccGr.insert();

it should work for all file content and types

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

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

View solution in original post

15 REPLIES 15

@Saquib Mohammed 

you need to parse the incoming request body and invoke that code that many number of times

since it works for 1 it would work for all the files as well

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

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

-O-
Kilo Patron

You did not move grIncTask to the 1st record; grIncTask.next() is missing.

Thank you. That worked. However, it works for text and csv but for other content types, it is throwing error 

505 HTTP Version Not Supported

Any pointers? I am using the MIME content types from the below link

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

fyi... I am trying doc, xls and pdf and i am getting error for these

Try

 

var grIncTask = new GlideRecord('incident_task');
grIncTask.addQuery('correlation_id', correlationId);
grIncTask.query();
if (grIncTask.next()) {
		var data = 'iVBORw0KGgoAAAANSUhEUgAAACIAAAASCAYAAAA+PQxvAAABcWlDQ1BpY2MAACiRdZG/S8NAFMe/bRWlVjrUQcQhQxWFFoqCiJPWoUuRUitYdUmuSSskabikSHEVXBwKDqKLvwb/A10FVwVBUAQRN3d/LVLiu6bQIu0Ll/fhe+/7uHsH+NM6M+yeBGCYDs+mktJqfk3qe4cPQUQwiTmZ2dZCJpNG1/h5pGqKh7jo1b2uYwwUVJsBvn7iGWZxh3ieOL3lWIL3iIdYSS4QnxDHOB2Q+Fboisdvgosefwnmuewi4Bc9pWIbK23MStwgniCOGnqFNc8jbhJSzZVlyiO0RmEjixSSkKCggk3ocBCnbNLMOvsSDd8SyuRh9LdQBSdHESXyxkitUFeVska6Sp+Oqpj7/3na2vSU1z2UBHpfXfdzDOjbB+o11/09dd36GRB4Aa7Nlr9Mc5r9Jr3W0qLHQHgHuLxpacoBcLULDD9bMpcbUoCWX9OAjwtgMA9E7oHgujer5j7On4DcNj3RHXB4BIxTfXjjDyacaBytCYw0AAAACXBIWXMAAAsSAAALEgHS3X78AAABpElEQVRIx2N0jtvzn2EQABYWZkaGnfOdGSkx5D8QUKLfJX4vAwsjIyNNfGhUjmCzv1/FsGlWGIMovhChhTtAjjjX0Aw0nYfhP5MSA8PfbwxWaasYjgMdgwswUTtEwI6ou8bA8NuVwTJbmsEq8ycD428zhuM9cgyWQMfgDBFmJtokPsuSR/AQADng2IQXQJYE7hBhoEXc/P+JKcbMgVcLExMV3bFt2z5I9DQbwkMCFh1WuQIoarAkVuq5xMvLicHTaQbD/zd7oKZzAjEvAyMLH5AWBGJ+Bqs8kDp65BomoOVMLFA2ByRKmLig4px40ggVQcik00AT2YFp5A+Y3nEmksG63ALiGLCD2OnjEHDCZ2SHYKil0jqKkBBh5ICI08UhwJKekZEN6HtWeC5Zm2/GCI4ioMPAcrgc8p+KVd6aPFOgr1nBaYERaLGn3QmGf9+mAl0H5INDhBV3gfb/P3Ur3/+/nzEwCnkAi/X3wFARhNLAoh5E46tr/v77T9VypOZAAjy5IMUYXKw5AEc58vfvf6qWI9jKCFTghD2d06JhBPI5qTEOAKR1bBlxL8y7AAAAAElFTkSuQmCC';

		var dataAsBytes = GlideStringUtil.base64DecodeAsBytes(data);

		var sys_attachmentUniqueValue = new GlideSysAttachment().write(grIncTask, 'lock.png', 'image/png', dataAsBytes);

		gs.info('sys_attachmentUniqueValue: ' + sys_attachmentUniqueValue);
}

 

It should attach a small lock icon to the incident.

It works running it in scripts background.

Also try to add

 

gs.info('isBase64: ' + GlideStringUtil.isBase64(base64Encodedcontent));

 

after

 

var base64Encodedcontent = queryParamsVar.Base64Enc[0];

 

What does it print?