Requirement: Download attachments from SharePoint Online List
PowerShell to download attachments from a List Item:
Lets download SharePoint list item attachment programmaticallyfrom a particular list item.
Download Attachments from All Items in the List using PowerShell:
Here is the PowerShell to download SharePoint Online list attachments from all items.
PowerShell to download attachments from a List Item:
Lets download SharePoint list item attachment programmaticallyfrom a particular list item.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Function Download-ListItemAttachments()
{
param
(
[Parameter(Mandatory=$true)] [string] $SiteURL,
[Parameter(Mandatory=$true)] [string] $ListName,
[Parameter(Mandatory=$true)] [string] $ListItemID,
[Parameter(Mandatory=$true)] [string] $DownloadPath
)
Try {
#Setup Credentials to connect
$Cred = Get-Credential
$Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Cred
#Get the List Item
$List = $Ctx.Web.Lists.GetByTitle($ListName)
$ListItem= $List.GetItemByID($ListItemID)
#Get All attachments from the List Item
$AttachmentsColl = $ListItem.AttachmentFiles
$Ctx.Load($AttachmentsColl)
$Ctx.ExecuteQuery()
#Get each attachment
ForEach($Attachment in $AttachmentsColl)
{
#Download attachment
$FileContent = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($Ctx, $Attachment.ServerRelativeUrl)
$FileStream = [System.IO.File]::Create($DownloadPath+$Attachment.FileName)
$FileContent.Stream.CopyTo($FileStream)
$FileStream.Close()
}
write-host -f Green "Total List Attachments Downloaded : $($AttachmentsColl.count)"
}
Catch {
write-host -f Red "Error Downloading List Item Attachments!" $_.Exception.Message
}
}
#Set Parameters
$SiteURL= "https://crescent.sharepoint.com/"
$ListName="Projects"
$ListItemID="1"
$DownloadPath="C:\Temp\"
#Call the function to copy list items
Download-ListItemAttachments -SiteURL $SiteURL -ListName $ListName -ListItemID $ListItemID -DownloadPath $DownloadPath
Download Attachments from All Items in the List using PowerShell:
Here is the PowerShell to download SharePoint Online list attachments from all items.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Function Download-ListAttachments()
{
param
(
[Parameter(Mandatory=$true)] [string] $SiteURL,
[Parameter(Mandatory=$true)] [string] $ListName,
[Parameter(Mandatory=$true)] [string] $DownloadDirectory
)
Try {
#Setup Credentials to connect
$Cred = Get-Credential
$Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Cred
#Get All Items from the List
$List = $Ctx.Web.Lists.GetByTitle($ListName)
$ListItems = $List.GetItems([Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery())
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
#Create download directory if it doesn't exist
If (!(Test-Path -path $DownloadDirectory))
{
New-Item $DownloadDirectory -type directory
}
#Iterate through each list item
Foreach($Item in $ListItems)
{
#Get All attachments from the List Item
$AttachmentsColl = $Item.AttachmentFiles
$Ctx.Load($AttachmentsColl)
$Ctx.ExecuteQuery()
#Get attachment for each list item
ForEach($Attachment in $AttachmentsColl)
{
#Download attachment
$FileContent = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($Ctx, $Attachment.ServerRelativeUrl)
$FileName= $DownloadDirectory+$Item.id.ToString()+"_"+$Attachment.FileName
$FileStream = [System.IO.File]::Create($FileName)
$FileContent.Stream.CopyTo($FileStream)
$FileStream.Close()
}
}
write-host -f Green "List Attachments Downloaded Successfully!"
}
Catch {
write-host -f Red "Error Downloading List Attachments!" $_.Exception.Message
}
}
#Set Parameters
$SiteURL= "https://crescent.sharepoint.com/"
$ListName="Projects"
$DownloadDirectory="C:\Temp\"
#Call the function to copy list items
Download-ListAttachments -SiteURL $SiteURL -ListName $ListName -DownloadDirectory $DownloadDirectory