Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing an attached file using SharePoint 2010's OData API

An adaptation of Vadim's answers to Upload file to SharePoint 2010 using PowerShell and the OData API and SharePoint 2010 REST API JQUery Insert, Update, Delete.

Attempting to upload a new version of an attachment:

Function Update-Attachments() {

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,Position=1)]
        [string]$WebUrl, 

        [Parameter(Mandatory=$True,Position=2)]
        [string]$ListName, 

        [Parameter(Mandatory=$True,Position=3)]
        [int]$ItemId,

        # pipeline support
        [Parameter(Mandatory=$True,Position=4,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
        # associate FileInfo object's FullName property to be bound to parameter
        [Alias('FullName')]
        [string[]]$Paths
    )

    BEGIN {}
    PROCESS {

        # 
        $endpointUri = New-Object System.Uri("$WebUrl/_vti_bin/listdata.svc/$ListName($ItemId)/Attachments")

        Foreach ($Path In $Paths) {
            Write-Verbose "Path: $Path"

            $fileName = (Split-Path $Path -Leaf)
            $fileContent = ([IO.File]::ReadAllBytes($Path))
            $headers = @{
                "X-HTTP-Method" = "MERGE";
                "If-Match" = "*"
            }

            try {
                # reset each pass to ensure that prior response isn't reused
                $response=$null
                $response = Invoke-WebRequest -Uri $endpointUri -Method POST -UseDefaultCredentials -Body $fileContent -Headers $headers -ContentType "*/*"
            }

            # Invoke-WebRequest throws System.Net.WebException
            catch [System.Net.WebException] {
                throw $_
            }

            finally {
                # returns Microsoft.PowerShell.Commands.HtmlWebResponseObject
                $response
            }

        } # Foreach

    } # PROCESS
    END {}

}

Using the command throws (405) Method Not Allowed:

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

I've tried variations on the endpoint:

  • $endpointUri = New-Object System.Uri("$WebUrl/_vti_bin/listdata.svc/$ListName/Attachments/$ItemId/$fileName")
  • $endpointUri = New-Object System.Uri("$WebUrl/_vti_bin/listdata.svc/Attachments(EntitySet='$ListName',ItemId=$ItemId,Name='$fileName')")

and switching between PUT and MERGE.

What am I missing?

like image 817
craig Avatar asked Nov 10 '22 10:11

craig


1 Answers

Can you check whether this SharePoint 2013 reference works with the 2010 API?

url: http://site url/_api/web/lists/getbytitle('list title')/items(item id)/AttachmentFiles('file name')/$value
method: POST
body: "Contents of file."
headers:
    Authorization: "Bearer " + accessToken
    "X-HTTP-Method":"PUT"
    X-RequestDigest: form digest value
    content-length:length of post body

https://msdn.microsoft.com/en-us/library/office/dn292553.aspx?f=255&MSPPError=-2147217396

like image 87
Lucas Rodrigues Avatar answered Nov 15 '22 07:11

Lucas Rodrigues