PowerShell
PowerShell
Xero Get Attachment (Download a Xero Attachment)
Demonstrates how to get the content of an attachment in Xero.Note: This example requires Chilkat v9.5.0.64 or greater.
Chilkat PowerShell Downloads
Add-Type -Path "C:\chilkat\ChilkatDotNet47-x64\ChilkatDotNet47.dll"
$success = $false
# Note: Requires Chilkat v9.5.0.64 or greater.
# This requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
$rest = New-Object Chilkat.Rest
# Before sending REST API calls, the REST object needs to be
# initialized for OAuth1.
# See Xero 2-Legged OAuth1 Setup for sample code.
# Assuming the REST object's OAuth1 authenticator is setup, and the initial
# connection was made, we may now send REST HTTP requests..
# --------------------------------------------------------------
# First get a list of attachments for a given document (in this case a Receipt).
$endPoint = "Receipts"
$receiptID = "c4f40e59-c390-0001-caff-ce731c707d00"
$sbPath = New-Object Chilkat.StringBuilder
$sbPath.Append("/api.xro/2.0/{Endpoint}/{Guid}/Attachments/")
$numReplaced = $sbPath.Replace("{Endpoint}",$endPoint)
$numReplaced = $sbPath.Replace("{Guid}",$receiptID)
$responseXml = $rest.FullRequestNoBody("GET",$sbPath.GetAsString())
if ($rest.LastMethodSuccess -ne $true) {
$($rest.LastErrorText)
exit
}
# A 200 response is expected for actual success.
if ($rest.ResponseStatusCode -ne 200) {
$($responseXml)
exit
}
# Examine the response.
$($responseXml)
# A sample response looks like this:
# <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <Id>b235646f-34ac-4b15-90ce-d63267f7cd33</Id>
# <Status>OK</Status>
# <ProviderName>ChilkatPrivate</ProviderName>
# <DateTimeUTC>2016-11-11T14:32:17.0908971Z</DateTimeUTC>
# <Attachments>
# <Attachment>
# <AttachmentID>0edcddc8-325f-40c7-b950-8c71f14afc7c</AttachmentID>
# <FileName>penguins.jpg</FileName>
# <Url>http://api.xero.com/api.xro/2.0/Receipts/c4f40e59-c390-0001-caff-ce731c707d00/Attachments/penguins.jpg</Url>
# <MimeType>image/jpg</MimeType>
# <ContentLength>777835</ContentLength>
# </Attachment>
# <Attachment>
# <AttachmentID>0adffdc8-325f-65c7-b950-4391f14af908</AttachmentID>
# <FileName>starfish.jpg</FileName>
# <Url>http://api.xero.com/api.xro/2.0/Receipts/c4f40e59-c390-0001-caff-ce731c707d00/Attachments/starfish.jpg</Url>
# <MimeType>image/jpg</MimeType>
# <ContentLength>24537</ContentLength>
# </Attachment>
# </Attachments>
# </Response>
$xml = New-Object Chilkat.Xml
$xml.LoadXml($responseXml)
# Iterate over the attachments and download each.
$numRecords = $xml.NumChildrenAt("Attachments")
$("Number of Attachments = " + $numRecords)
$sbSaveFilePath = New-Object Chilkat.StringBuilder
$sbAttachmentPath = New-Object Chilkat.StringBuilder
$attachmentData = New-Object Chilkat.BinData
$i = 0
while ($i -lt $numRecords) {
$xml.I = $i
$attachmentID = $xml.GetChildContent("Attachments|Attachment[i]|AttachmentID")
$filename = $xml.GetChildContent("Attachments|Attachment[i]|FileName")
$("AttachmentID: " + $attachmentID)
$("Filename: " + $filename)
$("----")
# Download this attachment.
# First build the path for this particular attachment by appending the FileName to the path used to get the list of attachments.
$sbAttachmentPath.Clear()
$sbAttachmentPath.AppendSb($sbPath)
$sbAttachmentPath.Append($filename)
# Send the GET request in one call, and then get the response in the next two.
$success = $rest.SendReqNoBody("GET",$sbAttachmentPath.GetAsString())
if ($success -ne $true) {
$($rest.LastErrorText)
exit
}
# Get the response header. If it's not a 200 success status code, then the response body does NOT contain
# the attachment data.
$statusCode = $rest.ReadResponseHeader()
if ($statusCode -eq -1) {
# We didn't get any response..
$($rest.LastErrorText)
exit
}
if ($statusCode -ne 200) {
$("Response Status: " + $statusCode)
$responseBody = $rest.ReadRespBodyString()
if ($rest.LastMethodSuccess -ne $true) {
$("Failed to read the response body.")
}
else {
$($responseBody)
}
$("Failed.")
exit
}
# OK, the response header indicates the attachment content is forthcoming...
# There are a few ways to get the response body. If it is a very large attachment, it can be streamed directly
# to a file. We'll assume it's not, so we'll get the response into a BinData object, and then save it to a file.
$attachmentData.Clear()
$success = $rest.ReadRespBd($attachmentData)
if ($success -ne $true) {
$($rest.LastErrorText)
exit
}
# Save the data to the file.
$sbSaveFilePath.SetString("qa_output/")
$sbSaveFilePath.Append($filename)
$success = $attachmentData.WriteFile($sbSaveFilePath.GetAsString())
if ($success -ne $true) {
$("Failed to save to output file.")
}
else {
$("Saved to " + $sbSaveFilePath.GetAsString())
}
$i = $i + 1
}