Sample code for 30+ languages & platforms
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

PowerShell
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
}