4

我試圖將文件上載到SharePoint 2010:上傳文件到SharePoint 2010中使用PowerShell和OData的API

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 

我收到一條錯誤:

Invoke-WebRequest : An error occurred while processing this request. At 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,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

**編輯**

文件的原始內容:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit 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 vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. 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 rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.

該腳本在服務器上創建一個文件,但與此內容:

filename=test.txt&filecontent=Lorem+ipsum+dolor+sit+amet%2c+consectetur+adipiscing+elit.+Donec+a+diam+lectus.+Sed+sit+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%2c+ut+porta+lorem+lacinia+consectetur.+Donec+ut+libero+sed+arcu+vehicula+ultricies+a+non+tortor.+Lorem+ipsum+dolor+sit+amet%2c+consectetur+adipiscing+elit.+Aenean+ut+gravida+lorem.+Ut+turpis+felis%2c+pulvinar+a+semper+sed%2c+adipiscing+id+dolor.+Pellentesque+auctor+nisi+id+magna+consequat+sagittis.+Curabitur+dapibus+enim+sit+amet+elit+pharetra+tincidunt+feugiat+nisl+imperdiet.+Ut+convallis+libero+in+urna+ultrices+accumsan.+Donec+sed+odio+eros.+Donec+viverra+mi+quis+quam+pulvinar+at+malesuada+arcu+rhoncus.+Cum+sociis+natoque+penatibus+et+magnis+dis+parturient+montes%2c+nascetur+ridiculus+mus.+In+rutrum+accumsan+ultricies.+Mauris+vitae+nisi+at+sem+facilisis+semper+ac+in+est.

我缺少什麼?我是否需要包含內容長度?設置MIME類型?

+1

你有使用Fiddler想看看從服務器的流量?如果在內部檢查ULS日誌 – Max

+0

有幾個問題:1)您是否嘗試將文件附加到現有列表項目,或者您是否想將文件上傳到文件夾? /附件應該特定於附加到列表項目。 2)這是從服務器場中的服務器上傳的,還是這個遠程的? 3)代碼中382指向哪一行? (因爲你只有35條線,我認爲還有更多)。 – Graham

+0

1.將文件附加到現有列表項目2.從工作站上傳3.需要研究 – craig

回答

2

爲了創建一個附件資源以下屬性必須被指定:

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

話雖如此,我的conslution指定的body參數($payload)是在所提供的示例無效。

下面的例子演示瞭如何上傳通過SharePoint 2010 REST接口附件文件:

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

} 

用法:

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

更新

通過提琴手,它進行一些分析後確定正確的端點url應該是:

/_vti_bin/listdata.svc/Attachments HTTP/1.1 

代替:

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

修改例

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

} 
+0

這將工作*用新版本*替換*一個文件(假設相同的名稱)嗎?或者該方法需要「PUT」? – craig

+0

該函數返回'System.Net.WebException:遠程服務器返回錯誤:(500)內部服務器錯誤。肯定地說,該文件被附加到該任務,並且其內容似乎是有效的。思考? – craig

+0

將驗證它爲什麼會出現此錯誤。 –

相關問題