Inserts an attachment for the specified record using base64 encoded content.

SK36
Tera Contributor

Hi all, I'm trying to insert an image into sys_attachment table through scripted REST API.

The attachment is getting attached. But I could not see the content of the image. Then I came to know I have to encode it with base64 and i did it and inserted it, when I download the same image, I counld not see it. Here is my code below.

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

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

        var requestBody = request.body;
        var requestData = requestBody.data;
        var reqFor = requestData.requested_for;
        var cat = requestData.category;
        var subcat = requestData.subcategory;
        var summ = requestData.summary;
        var info = requestData.information;
        var catalogitem = requestData.catalog_item;
    var fileName = requestData.fileName;
    var fileContentType = requestData.contentType;
    var fileData =requestData.content;

        var reqBy = '';
        var cat_item = '';

        gs.info('UVO Requested For' + reqFor);
        var gr = new GlideRecord("sys_user");
        gr.addQuery("name", reqFor.toString());
        gr.query();
        if (gr.next()) {
            reqBy = gr.sys_id;
        }
        var catalog = new GlideRecord("sc_cat_item");
        catalog.addQuery("name", catalogitem.toString());
        catalog.query();
        if (catalog.next()) {
            cat_item = catalog.sys_id;
        }


        var requested_for = reqBy.toString();
        var catalog_item = cat_item.toString();


        var cart = new sn_sc.CartJS();
        var item = {
            'sysparm_id': catalog_item,
            'sysparm_quantity': '1',
            'variables': {
                'requested_by':requested_for,
                'category': cat.toString(),
                'subcategory_02':subcat.toString(),
                'request_summary':  summ.toString(),                                          
                'detailed_information': info.toString(),
            }
        };
        cart.addToCart(item);

        var request1 = {
            'special_instructions': '',
            'requested_for': requested_for,
            'delivery_address': '',
        };
        // Place order from cart
        var requestDetails = cart.submitOrder(request1);

        // update details in the Requested Item
        // pull out the Request Sys ID from the order
        var reqSysID = requestDetails.request_id;
        var reqNumber;
        var grnumber = new GlideRecord("sc_req_item");
        grnumber.addQuery("request", reqSysID);
        grnumber.query();
        if (grnumber.next()) {
            reqNumber = grnumber.number;
        }
        
    var rec = new GlideRecord('sc_req_item');
    rec.addQuery('number',reqNumber);
    rec.query();
    if(rec.next()){
    var sa = new GlideSysAttachment();
        sa.write(rec, fileName, fileContentType, fileData);
        //sa.write(rec, fileName, fileContentType, StringUtil.base64DecodeAsBytes(fileData));
        //var agr = sa.writeBase64(rec, fileName, fileContentType, fileData);
        var responseBody = {};
        responseBody.number = reqNumber;
        responseBody.status = "Success";
        response.setBody(responseBody);
    }
    else{
        var responseBodyFailure = {};
        responseBodyFailure.status = "Failure";
        response.setBody(responseBodyFailure);
    }
        var bodyArray = [];
        var body = {};
        body.number = reqNumber.toString();
        //body.status = MMM;
        //body.status = reqBy;
        body.status = StringUtil.base64DecodeAsBytes(fileData);
        bodyArray.push(body);
        response.setBody(bodyArray);

    }

)(request, response);

})(request, response);

 

 

 

Here is my request :

{"requested_for":"S K","category":"Leave","subcategory":"Unable to apply leave","summary":"test","information":"test","catalog_item":"Leave","fileName":"testing.png","contentType":"image/png","content":"encoded image content"}

1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

it should work fine. Are you sure you gave correct bas64encoded data of that image file

I shared solution for something similar 2 years ago

Scripted Rest API to update incident with attachment

Regards
Ankur

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

View solution in original post

4 REPLIES 4

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

it should work fine. Are you sure you gave correct bas64encoded data of that image file

I shared solution for something similar 2 years ago

Scripted Rest API to update incident with attachment

Regards
Ankur

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

it is showing like this. 

find_real_file.png

 

But when I click the download option. it is showing like this.

find_real_file.png 

Any idea why it is showing like this?

SK36
Tera Contributor

it is working. Thank you Ankur for your help.

Siddhesh2
Giga Guru

@SK36  Could you please share the solution as I am facing the same issue.