The CreatorCon Call for Content is officially open! Get started here.

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.