Upload a file to SharePoint 2010 using PowerShell and the OData API

I am trying to upload a file in SharePoint 2010:

Function Add-Attachments() { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [int]$Id, [Parameter(Mandatory=$True)] [string[]]$Paths ) BEGIN {} PROCESS { $url = "http://server/resource/_vti_bin/listdata.svc/TheList($Id)/Attachments" Foreach ($Path in $Paths) { Write-Verbose "Attaching $Path ..." $headers = @{ 'Slug' = "TheList|$Id|$(Split-Path $path -Leaf)" } $Payload = @{filename=(Split-Path $path -Leaf);filecontent=([IO.File]::ReadAllBytes($path))} Invoke-WebRequest -Uri $url -Method Post -UseDefaultCredentials -Body $Payload -Headers $headers } # Foreach } # PROCESS END {} } Add-Attachments -Id 1234 -Paths 'C:\Users\gandalf\Desktop\test.txt' -verbose 

I get an error message:

Invoke-WebRequest: An error occurred while processing this request. In C: \ Users \ Gandalf \ Documents \ WindowsPowerShell \ Scripts \ SP \ SharePoint2010.ps1: 382 char: 13 + Invoke-WebRequest -Uri $ url -Method Post -UseDefaultCredentials -Bod ... + ~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: InvalidOperation: (System.Net.HttpWebRequest: HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId: WebCmdletWebResponseException, .PowerShell.Commands.InvokeWebRequestCommand

** edit **

Original file contents:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam Lectus. Sid sits amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut Libero sed arcu carula ultricies - not grueling. Lorem ipsum dolor sits amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna ensat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ur convallis libero in urna ultrafine batteries. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In the rootroom by accumulations. Mauris vitae nisi on sem facilisis semper ac in sc.

The script creates the file on the server, but with this content:

file_name = test.txt & filecontent = Lorem + Ipsum + Dolor + sit + AMET% 2c + consectetur + adipiscing + Elite + Donets + A + Diam + Lectus + Sed + sit + Amet + Ipsum + mauris + ... Patron + congue + tongue + ac + Quam + viverra + NEC + consectetur + ante + hendrerit. + Donets + ex + Tos + Dolor +. Contact Us + ex + di + Eget + libero + excreta + Mattis + sit + Amete + vite + augue +. Us + tincidunt + congue + enim% 2c + u + Porta + Lorem + lacinia + consectetur. + Donets + u + libero + Sed + arcu + vehicula + ultricies + a + not + tortor. + Lorem + Ipsum + Dolor + sit + AMET% 2c + consectetur + adipiscing + Elite +. Aenean + u + gravida + Lorem. + ut + turpis + Felis% 2c + pulvinar + a + zetreg + Sed% 2c + adipiscing + ID + Dolor. + Pellentesque + auctor + NISI + ID + magna + consequat + sagittis. + Curabitur + dapibus + enim + sit + Amet + Elite + pharetra + tincidunt + feugiat + nisl + imperdiet. + Ut + convallis + libero + in + Urn + ultrices + accumsan. + Donets + EDMS + Odio + eros. + Donets + viverra + miles + Quis + Quam + pulvinar + at + malesuada + arcu + rhoncus. + Cum + sociis + natoque + penatibus + ex + Magnis + dis + woman in childbirth + Montes% 2c + nascetur + ridiculus + MUS. + B + rutrum + accumsan + ultricies. + Mauris + + help + NISI for + + facilisis sem + zetreg + AC + in + EST.

What am I missing? Should content length be included? Set the MIME type?

+4
source share
1 answer

To create an attachment resource, you must specify the following properties:

 Endpoint Uri: http://server/site/_vti_bin/listdata.svc/entityset(itemid)/Attachments Method: POST Headers: Slug: "entityset|itemid|name" ContentType: */* Body: content 

Having said that, my expression is that the specified parameter body ( $payload ) is not valid in the above example.

The following example shows how to upload an attachment file through the SharePoint 2010 REST interface:

 Function Add-Attachments() { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$WebUrl, [Parameter(Mandatory=$True)] [string]$ListName, [Parameter(Mandatory=$True)] [int]$ItemId, [Parameter(Mandatory=$True)] [string]$SourcePath ) BEGIN {} PROCESS { $endpointUri = New-Object System.Uri("$WebUrl/_vti_bin/listdata.svc/$ListName($ItemId)/Attachments") $fileName = (Split-Path $SourcePath -Leaf) $fileContent = ([IO.File]::ReadAllBytes($SourcePath)) $headers = @{ 'Slug' = "$ListName|$ItemId|$fileName"; } Invoke-WebRequest -Uri $endpointUri -Method Post -UseDefaultCredentials -Body $fileContent -Headers $headers -ContentType "*/*" } # PROCESS END {} } 

Using:

 Add-Attachments -WebUrl "http://contoso.intranet.com/" -ListName "Tasks" -ItemId 1 -SourcePath "C:\Users\user\Documents\SharePointUserGuide.docx" -verbose 

Update

After doing some analysis through Fiddler, it was determined that the correct endpoint URL should be:

 /_vti_bin/listdata.svc/Attachments HTTP/1.1 

instead:

 /_vti_bin/listdata.svc/Tasks(<id>)/Attachments HTTP/1.1 

Modified Example

 Function Add-Attachments() { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$WebUrl, [Parameter(Mandatory=$True)] [string]$ListName, [Parameter(Mandatory=$True)] [int]$ItemId, [Parameter(Mandatory=$True)] [string]$SourcePath ) BEGIN {} PROCESS { $endpointUri = New-Object System.Uri("$WebUrl/_vti_bin/listdata.svc/Attachments") $fileName = (Split-Path $SourcePath -Leaf) $fileContent = ([IO.File]::ReadAllBytes($SourcePath)) $headers = @{ 'Slug' = "$ListName|$ItemId|$fileName"; } Invoke-WebRequest -Uri $endpointUri -Method Post -UseDefaultCredentials -Body $fileContent -Headers $headers -ContentType "*/*" } # PROCESS END {} } 
+2
source

All Articles