how to get export to pdf into zip with all attchment

ankit_gupta1
Tera Expert

i have   a requirement in which i have a UI action on my table , so when ever i click on that button i will get (form pdf + activity pdf + all attachment) into a one zip file that might be downloadable

1 ACCEPTED SOLUTION

ankit_gupta1
Tera Expert

first create a ui action that attach (export to pdf) form pdf in your attachment and call processor



****************************************


var rm = new sn_ws.RESTMessageV2();



rm.setHttpMethod('GET');



var url = gs.getProperty("glide.servlet.uri") + current.getTableName()+ '.do?PDF&sys_id=' + current.sys_id;



rm.setEndpoint(url);



rm.setBasicAuth(gs.getProperty('glide.user.userid'), gs.getProperty('glide.user.password'));



rm.saveResponseBodyAsAttachment(current.getTableName(),current.sys_id,current.number+".pdf");



var response = rm.execute();



action.setRedirectURL('exportAttachmentsToZip.do?sysparm_sys_id=' + current.sys_id + '&sysparm_table=' + current.getTableName() + '&sysparm_num=' + current.number);




*******************************************



create a new processor "exportAttachmentsToZip"




************************************************************


var sysid = g_request.getParameter('sysparm_sys_id');


var table = g_request.getParameter('sysparm_table');


var num = g_request.getParameter('sysparm_num');



//var url = table + '.do?PDF&sys_id=' + sysid;  


  //window.open(url);



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;


              this.addBytesToZip(out, zipName, file, binData);


              count ++;


      }


      // Complete the ZIP file


      out.close();



var gr1 = new GlideRecord('sys_attachment');


gr1.addQuery('table_sys_id', theRecord.sys_id);


gr1.addQuery('table_name', theRecord.getTableName());


gr1.addQuery('file_name', num+'.pdf');


gr1.query();


if(gr1.next())


  gr1.deleteRecord();




}



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();


}




thats work fine . Plz remember user(userid,pass) must have admin role


View solution in original post

5 REPLIES 5

ankit_gupta1
Tera Expert

first create a ui action that attach (export to pdf) form pdf in your attachment and call processor



****************************************


var rm = new sn_ws.RESTMessageV2();



rm.setHttpMethod('GET');



var url = gs.getProperty("glide.servlet.uri") + current.getTableName()+ '.do?PDF&sys_id=' + current.sys_id;



rm.setEndpoint(url);



rm.setBasicAuth(gs.getProperty('glide.user.userid'), gs.getProperty('glide.user.password'));



rm.saveResponseBodyAsAttachment(current.getTableName(),current.sys_id,current.number+".pdf");



var response = rm.execute();



action.setRedirectURL('exportAttachmentsToZip.do?sysparm_sys_id=' + current.sys_id + '&sysparm_table=' + current.getTableName() + '&sysparm_num=' + current.number);




*******************************************



create a new processor "exportAttachmentsToZip"




************************************************************


var sysid = g_request.getParameter('sysparm_sys_id');


var table = g_request.getParameter('sysparm_table');


var num = g_request.getParameter('sysparm_num');



//var url = table + '.do?PDF&sys_id=' + sysid;  


  //window.open(url);



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;


              this.addBytesToZip(out, zipName, file, binData);


              count ++;


      }


      // Complete the ZIP file


      out.close();



var gr1 = new GlideRecord('sys_attachment');


gr1.addQuery('table_sys_id', theRecord.sys_id);


gr1.addQuery('table_name', theRecord.getTableName());


gr1.addQuery('file_name', num+'.pdf');


gr1.query();


if(gr1.next())


  gr1.deleteRecord();




}



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();


}




thats work fine . Plz remember user(userid,pass) must have admin role


"Save all attachments" button does not download all the attachments



1. If you select the "Save All Attachments" ui action and unzip the folder, only 2 out of the 6 *.nmf files have downloaded. Four of them have not as they are 0KB. I have done this over 5 times, closing and opening my Chrome browser and it is reproducible each time.


2. However, if you select to download them all one by one - its successful.


find_real_file.png


find_real_file.png


Does it work with smaller attachments?


Hi Ankit,

 

This is not working and getting the below error.

 

find_real_file.png