Find your people. Pick a challenge. Ship something real. The CreatorCon Hackathon is coming to the Community Pavilion for one epic night. Every skill level, every role welcome. Join us on May 5th and learn more here.

copy a catalog item attachment (an image) to a records image field

Daryll Conway
Giga Guru

I'm trying to take an attachment (an image), which is added to a catalog item and via a workflow script add the image to an image (type) field on a custom table.

Here is my script...

var brandName = current.variables.brand_name.getDisplayValue();

var logo = '';

copyAttachment();

function addBrandRecord(){

    var findBrand = new GlideRecord('u_brand');

    findBrand.addQuery('name', brandName);

    findBrand.query();

    while (findBrand.next()) {

    findBrand.street = current.variables.address;

    findBrand.phone = current.variables.phone;

    findBrand.website =   current.variables.website;

    findBrand.u_twitter = current.variables.twitter;

    findBrand.u_facebook = current.variables.facebook;

    findBrand.u_linkedin = current.variables.linkedin;

    findBrand.u_other_links = current.variables.other_links;

    findBrand.u_description = current.variables.description;

    findBrand.u_current_offers = current.variables.current_offers;

    findBrand.u_brand_state = "Awaiting Approval";

    findBrand.u_logo_icon = logo;

    findBrand.update();

  }

}

function copyAttachment() {

    var grLogo = new GlideRecord('sys_attachment');

    grLogo.addQuery('table_sys_id', current.sys_id);

    grLogo.query();

    if (grLogo.next()) {

    var sa = new GlideSysAttachment();

    sa.getContent(grLogo);

    sa.getContentBase64(grLogo);

    var grImg = new GlideRecord('db_image');

    grImg.initialize();

    grImg.category = "general";

    grImg.name = String(grLogo.file_name);

    grImg.image = sa.getContent(grLogo);

    grImg.insert();

    logo = grImg.image.sys_id + ".iix";

    gs.log('Attachment image = ' + grImg.image, 'DC');

    gs.log('att href = ' + grLogo.file_name.href, 'DC');

    gs.log('Attachment = ' + logo, 'DC');

    addBrandRecord();

  }

}

I can get the attachment fine but the getContent (& getContent64) comes back as undefined in my logs.

Has anyone done this before?

Can I transfer an attachment to an image field?

Is there another way to do this?

1 ACCEPTED SOLUTION

Daryll Conway
Giga Guru

This is my solution if anyone is interested...



copyAttachment();



function copyAttachment() {


    var findBrand = new GlideRecord('u_brand');


    findBrand.addQuery('name', brandName);


    findBrand.query();


    while (findBrand.next()) {


    var grLogo = new GlideRecord('sys_attachment');


    grLogo.addQuery('table_sys_id', current.sys_id);


    grLogo.query();


    if (grLogo.next()) {


    createImage(String(grLogo.sys_id), 'u_logo_icon', 'u_brand', String(findBrand.sys_id));


  }


  }


}



/*
attachmentID: sys_id of attachment containing the picture to be copied
fieldName: name of the image field to be used
tableName: name of the table containing the image field
tableID: sys_id of the record being copied to

example call:
createImage('551c4cf16f102100758ecb512e3ee47b', 'mobile_picture', 'sc_cat_item_producer', '29a39e830a0a0b27007d1e200ad52253');
*/
function createImage(attachmentID, fieldName, tableName, tableID) {


    var attachmentGR = new GlideRecord('sys_attachment');


    attachmentGR.get(attachmentID);



    var fields = attachmentGR.getFields();


    var imageGR = new GlideRecord('sys_attachment');


    imageGR.initialize();


    imageGR.compressed = attachmentGR.compressed;


    imageGR.content_type = attachmentGR.content_type;


    imageGR.size_bites = attachmentGR.size_bites;


    imageGR.size_compressed = attachmentGR.size_compressed;


    imageGR.file_name = fieldName;


    imageGR.table_name = 'ZZ_YY' + tableName;


    imageGR.table_sys_id = tableID;


    var imageID = imageGR.insert();



    copyAttachmentContent(attachmentID, imageID);


}



/*
oldID: sys_id of existing attachment
newID: sys_id of newly created attachment
*/
function copyAttachmentContent(oldID, newID) {


    var oldGR = new GlideRecord('sys_attachment_doc');


    oldGR.addQuery('sys_attachment', oldID);


    oldGR.query();


    while (oldGR.next()) {


    var newGR = new GlideRecord('sys_attachment_doc');


    newGR.initialize();


    newGR.data = oldGR.data;


    newGR.length = oldGR.length;


    newGR.position = oldGR.position;


    newGR.sys_attachment = newID;


    newGR.insert();


  }


}


View solution in original post

20 REPLIES 20

Daryll Conway
Giga Guru

This is my solution if anyone is interested...



copyAttachment();



function copyAttachment() {


    var findBrand = new GlideRecord('u_brand');


    findBrand.addQuery('name', brandName);


    findBrand.query();


    while (findBrand.next()) {


    var grLogo = new GlideRecord('sys_attachment');


    grLogo.addQuery('table_sys_id', current.sys_id);


    grLogo.query();


    if (grLogo.next()) {


    createImage(String(grLogo.sys_id), 'u_logo_icon', 'u_brand', String(findBrand.sys_id));


  }


  }


}



/*
attachmentID: sys_id of attachment containing the picture to be copied
fieldName: name of the image field to be used
tableName: name of the table containing the image field
tableID: sys_id of the record being copied to

example call:
createImage('551c4cf16f102100758ecb512e3ee47b', 'mobile_picture', 'sc_cat_item_producer', '29a39e830a0a0b27007d1e200ad52253');
*/
function createImage(attachmentID, fieldName, tableName, tableID) {


    var attachmentGR = new GlideRecord('sys_attachment');


    attachmentGR.get(attachmentID);



    var fields = attachmentGR.getFields();


    var imageGR = new GlideRecord('sys_attachment');


    imageGR.initialize();


    imageGR.compressed = attachmentGR.compressed;


    imageGR.content_type = attachmentGR.content_type;


    imageGR.size_bites = attachmentGR.size_bites;


    imageGR.size_compressed = attachmentGR.size_compressed;


    imageGR.file_name = fieldName;


    imageGR.table_name = 'ZZ_YY' + tableName;


    imageGR.table_sys_id = tableID;


    var imageID = imageGR.insert();



    copyAttachmentContent(attachmentID, imageID);


}



/*
oldID: sys_id of existing attachment
newID: sys_id of newly created attachment
*/
function copyAttachmentContent(oldID, newID) {


    var oldGR = new GlideRecord('sys_attachment_doc');


    oldGR.addQuery('sys_attachment', oldID);


    oldGR.query();


    while (oldGR.next()) {


    var newGR = new GlideRecord('sys_attachment_doc');


    newGR.initialize();


    newGR.data = oldGR.data;


    newGR.length = oldGR.length;


    newGR.position = oldGR.position;


    newGR.sys_attachment = newID;


    newGR.insert();


  }


}


Hi Daryll,



the script work perfect.


the only issue i see here is that the Image being broken.



i can just see the below:


Broken image.PNG


i have used the sysid directly: createImage('accc839f4f862200172734a18110c757'(sys id of the Image(db_image) records), 'u_image_survey', 'incident', '0e0a439f4f862200172734a18110c7a1');



any update from you hugely appreciated.


stephane_lemoin
Kilo Explorer

hello


your script dont create an image but an attachment..


if i create a image field on a table, nothing is diplayed.


stephane


Images are handled as attachments in ServiceNow.



When you use line 12...



createImage(String(grLogo.sys_id), 'u_logo_icon', 'u_brand', String(findBrand.sys_id));



This sets which field you are placing the image in so breaking this down...



createImage(<Source Sys_id>, <target field>, <target table>, <target record sys_id>);



I hope that helps, I have it working (just be aware of the format of the images and that it is an image type that ServiceNow can handle)