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

将验证它为什么会出现此错误。 –

相关问题