- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-02-2022 12:48 AM
HI,
I have a Requirement were I need to create UI ACTION link on the form.
If the user click on the link, The template should be downloaded.
I have stored the template in the Attachment table.
How to Achieve this ?
Thanks,
M  
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-02-2022 01:10 AM
Hi,
you can make the UI action as client side
On click - downloadRecord()
Script
function downloadRecord(){
	var sysId = ''; // give the sys_id of the attachment record
	var url = '/sys_attachment.do?sys_id=' + sysId;
	window.open(url);
}Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-02-2022 01:10 AM
Hi,
you can make the UI action as client side
On click - downloadRecord()
Script
function downloadRecord(){
	var sysId = ''; // give the sys_id of the attachment record
	var url = '/sys_attachment.do?sys_id=' + sysId;
	window.open(url);
}Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-03-2022 02:31 AM
HI Ankur,
Thanks for the Script. It works fine when i hardcode the SYSID.
I have stored the SYS ID of the Attachment Record in System property..
This Script is not working When i try to call the system property using gs.getProperty()..
can you help !!
Thanks,
M
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-03-2022 02:43 AM
Hi,
you cannot get system property using gs object in client side.
you can use display business rule on that table and store that sys_id in g_scratchpad
then use it in your UI action
Display BR:
g_scratchpad.sysId = gs.getProperty('propertyName'); // your property nameUI Action Script:
function downloadRecord(){
	var sysId = g_scratchpad.sysId;
	var url = '/sys_attachment.do?sys_id=' + sysId;
	window.open(url);
}regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
 
					
				
		
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-02-2022 01:41 AM
Hello Manasa,
you can use one of the best method to downloads all the files at a time in zip folder. 
1) Create a UI Action on the table 
Name:Save Attachments as ZIP
Condition - current.hasAttachments();
Script - 
action.setRedirectURL('exportAttachmentsToZip.do?sysparm_sys_id=' + current.sys_id + '&sysparm_table=' + current.getTableName());2) Create a processor
System Definition->Processors
Name: exportAttachmentsToZip
Type: script
Path: exportAttachmentsToZip
Script:
var sysid = g_request.getParameter('sysparm_sys_id');
var table = g_request.getParameter('sysparm_table');
var theRecord = new GlideRecord(table);
theRecord.addQuery('sys_id', sysid);
theRecord.query();
theRecord.next();
var zipName = 'attachments.zip';
var StringUtil = GlideStringUtil;
var gr = new GlideRecord('sys_attachment');
gr.addQuery('table_sys_id', theRecord.sys_id);
gr.addQuery('table_name', theRecord.getTableName());
gr.query();
if (gr.hasNext()){
    g_response.setHeader('Pragma', 'public');
    g_response.addHeader('Cache-Control', 'max-age=0');
    g_response.setContentType('application/octet-stream');
    g_response.addHeader('Content-Disposition', 'attachment;filename=' + zipName);
    var out = new Packages.java.util.zip.ZipOutputStream(g_response.getOutputStream());
    var count=0;
    while (gr.next()){
        var sa = new GlideSysAttachment();
        var binData = sa.getBytes(gr);
       
        var file = gr.file_name;
        addBytesToZip(out, zipName, file, binData);
        count ++;
    }
    // Complete the ZIP file
    out.close();
}
function addBytesToZip (out, dir, file, stream){
    // Add ZIP entry to output stream.
    out.putNextEntry(new Packages.java.util.zip.ZipEntry(file));
    out.write(stream, 0, stream.length);
    out.closeEntry();
}
The above solution has been referred by SNGURU.  I have implemented it on my PDI & it worked well.
Mark useful & Correct , if it helped you.
Cheers..!
Happy Learning
Tushar 
Cheers..!
Happy Learning:)
Tushar
