Attached file is not opening on the incident and service request table.

vinuth v
Tera Expert

Hi All,

I have created the Scripted REST API and provide the API and payload to the 3rd party. But when I try to open the file from the Incident table I am getting 

vinuthv_0-1677943322107.png

vinuthv_1-1677943354485.png

I am not able to open the file but file is attached to sys_attachment table

vinuthv_2-1677943420968.png

 

vinuthv_4-1677943483360.png

Tried with the different content types. I am facing this issue for Docs, Excl and Images.

 

Script is:

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var requestBody = request.body.dataString;
var requestBody1 = request.body.data;
var parser = new global.JSON();
var parsedData = parser.decode(requestBody);
var number = parsedData.incidentNumber;

var fileName = parsedData.fileName;

var fileContentType = parsedData.contentType;

var fileData = parsedData.fileData;

var rec = new GlideRecord('incident');
rec.addQuery('number', number);
rec.query();
if (rec.next()) {
var sa = new GlideSysAttachment();
// sa.write(rec, fileName, fileContentType, fileData);
sa.write(rec, fileName, fileContentType, GlideStringUtil.base64Decode(fileData));
var responseBody = {};
responseBody.incNumber = number;
responseBody.status = "Success";
response.setBody(responseBody);
} else {
var responseBodyFailure = {};
responseBodyFailure.status = "Failure";
response.setBody(responseBodyFailure);
}

})(request, response);

 

 

And Payload

{   
"incidentNumber": "INC4969852",   
"fileName": "test_6.doc",   
"contentType": "application/octet-stream",   
"fileData":  ""

}

 

Please anyone provide me the inputs.

Thanks in advance,

Vinuth

 

1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron
Tera Patron

@vinuth v 

is 3rd party sending proper base64 encoded data?

If yes then try this

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var requestBody = request.body.dataString;
var requestBody1 = request.body.data;
var parser = new global.JSON();
var parsedData = parser.decode(requestBody);
var number = parsedData.incidentNumber;

var fileName = parsedData.fileName;

var fileContentType = parsedData.contentType;

var fileData = parsedData.fileData;

var rec = new GlideRecord('incident');
rec.addQuery('number', number);
rec.query();
if (rec.next()) {

var ecc = new GlideRecord('ecc_queue');
ecc.initialize();
ecc.agent = "AttachmentCreator";
ecc.topic = "AttachmentCreator";
ecc.name = fileName + ":" + fileContentType;
ecc.source = rec.getTableName() + ":" + rec.sys_id;
ecc.payload = fileData;
ecc.insert();

var responseBody = {};
responseBody.incNumber = number;
responseBody.status = "Success";
response.setBody(responseBody);
} else {
var responseBodyFailure = {};
responseBodyFailure.status = "Failure";
response.setBody(responseBodyFailure);
}

})(request, response);

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

View solution in original post

7 REPLIES 7

Ankur Bawiskar
Tera Patron
Tera Patron

@vinuth v 

is 3rd party sending proper base64 encoded data?

If yes then try this

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var requestBody = request.body.dataString;
var requestBody1 = request.body.data;
var parser = new global.JSON();
var parsedData = parser.decode(requestBody);
var number = parsedData.incidentNumber;

var fileName = parsedData.fileName;

var fileContentType = parsedData.contentType;

var fileData = parsedData.fileData;

var rec = new GlideRecord('incident');
rec.addQuery('number', number);
rec.query();
if (rec.next()) {

var ecc = new GlideRecord('ecc_queue');
ecc.initialize();
ecc.agent = "AttachmentCreator";
ecc.topic = "AttachmentCreator";
ecc.name = fileName + ":" + fileContentType;
ecc.source = rec.getTableName() + ":" + rec.sys_id;
ecc.payload = fileData;
ecc.insert();

var responseBody = {};
responseBody.incNumber = number;
responseBody.status = "Success";
response.setBody(responseBody);
} else {
var responseBodyFailure = {};
responseBodyFailure.status = "Failure";
response.setBody(responseBodyFailure);
}

})(request, response);

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

Hi @Ankur Bawiskar 

Previously We used the base64Decode method and it's not worked for few extension so now we tried with the ecc_queue approach now it is working fine for all the extension.

I have one query why base64Decode method is not working for few extensions.

@vinuth v 

not very sure on that piece.

possibly the base64 decode has some limitations with file types

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