- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎09-30-2014 03:06 PM
Does anyone know of a way to get an attachment record from the system using cURL on the command line? We've tried a basic curl "http://myinstance.service-now.com/sys_attachment.do?sys_id=12345" and also adding user authentication, using curl -user "username:password" "https://myinstance.service-now.com/sys_attachment.do?sys_id=12345" with no luck. The REST API is no good in this situation since it returns a JSON object of the database record rather than the actual content of the attachment. We're trying to download a CSS file that we've attached to a UI page, so we need the actual CSS contained in the attachment.
Mark Stanger (Crossfuze) John Andersen hoping you guys may have stumbled across something like this or could point me where to look...
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-30-2015 11:26 AM
Hey! Yeah we did solve it. We ended up using a processor, which uses basic auth when they hit that URL. We passed the sys_id of the attachment record in as a parameter in the processor, and were able to get the contents of the attachment based on knowing the sys_id.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-29-2015 02:12 PM
Hey Mike McBride, where you able to solve this? I'm in a situation where emails are being sent with links to sys_attachment, but can't find a way for users to be able to see them without authentication.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-30-2015 11:26 AM
Hey! Yeah we did solve it. We ended up using a processor, which uses basic auth when they hit that URL. We passed the sys_id of the attachment record in as a parameter in the processor, and were able to get the contents of the attachment based on knowing the sys_id.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎08-26-2015 12:28 PM
Mike,
Can you share the code for this?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎11-05-2015 01:27 PM
I'm pretty sure I found this somewhere else on the community, but basically this processor will pull all of the attachments for a given record. Then using your chosen tech you can pull the attachments, decode them and save them as files. I used ruby below.
var incidentSysID = g_request.getParameter("sys_id");
count = 1;
var StringUtil = Packages.com.glide.util.StringUtil;
var gr = new GlideRecord("sys_attachment");
gr.addQuery("table_sys_id", incidentSysID);
gr.query();
//Starting to create the XML Document Response
var xmldoc = new XMLDocument("");
var myRootElement = xmldoc.createElement("executeResponse");
while (gr.next()){
//Getting the file and encoding it with Base 64 encoding
var sa = new Packages.com.glide.ui.SysAttachment();
var binData = sa.getBytes(gr);
var encData = StringUtil.base64Encode(binData);
//Creating the XML document elements for each attachcment
xmldoc.setCurrent(myRootElement);
var myElement = xmldoc.createElement("attachment");
myElement.setAttribute("number",count);
xmldoc.setCurrent(myElement);
xmldoc.createElement("file_name", gr.file_name);
xmldoc.createElement("encodedAttachment", encData);
count += 1;
}
//Sending the XML Document as the SOAP response
g_processor.writeOutput(xmldoc);
Ruby script
require 'rest-client'
require 'nokogiri'
require 'base64'
require 'byebug'
require 'csv'
CSV.foreach("list.csv") do |row|
number = row[0]
sys_id = row[1].to_s
if !Dir.exists?(number)
Dir.mkdir(number)
end
# Whatever your processor is called
url = "https://user:password@instance.service-now.com/incidentAttachments.do?sys_id=#password@instance.service-now.com/incidentAttachments.do?sys_id=#{sys_id}"
xml_doc = Nokogiri::XML(RestClient::Request.execute(:method => :get, :url => url, :timeout => 3600, :open_timeout => 3600))
xml_doc.xpath("//attachment").each do |n|
filename = n.xpath("file_name").first.content
content = n.xpath("encodedAttachment").first.content
f = File.new("#{number}//#{filename}", "wb")
f.write(Base64.decode64(content))
f.close
end
end