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  ||  ✨ 9x 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  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

-O-
Kilo Patron
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?