9

我正在使用 SP2010 客户端对象模型上传到文档库,遵循 Microsoft 此处的指示:http: //msdn.microsoft.com/en-us/library/ee956524.aspx#SP2010ClientOMOpenXml_Uploading

执行以下代码时,我面临 HTTP 409(冲突)状态代码。

var clientContext = new ClientContext("http://myservername/sites/subsitename") { Credentials = LogonCredentials };
using (var fileStream = new FileStream(@"C:\Temp\Test.txt", FileMode.Open))
{
    Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, "/MyDocLibraryName/Test_FromClientOM.txt", fileStream, true);
} 

我究竟做错了什么?

4

4 回答 4

11

这里的问题是我上传到的站点是一个子站点,而不是 sharepoint 的根。我不知道这是否是“设计”选择,但似乎您必须为 ClientContext 使用 sharepoint 的根,至少在这种特殊情况下是这样。

工作代码:

var clientContext = new ClientContext("http://myservername") { Credentials = LogonCredentials };
using (var fileStream = new FileStream(@"C:\Temp\Test.txt", FileMode.Open))
{
       Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, "/sites/subsitename/MyDocLibraryName/Test_FromClientOM.txt", fileStream, true);
} 
于 2010-12-06T17:32:00.017 回答
8

在尝试通过 SharePoint 2010 客户端对象模型上传文件时,我也遇到了 409 错误。确保您上传文件的路径完全存在。该调用不会创建任何(子)文件夹。正如您所说,您是将 ClientContext 连接到根子网站还是直接连接到子网站都没有关系。只需确保您始终向 SaveBinaryDirect 方法提供要上传到该位置的 SPSite 相对 URL。

例如,如果您将 ClientContext 连接到http://somesite/sites/subsitename,请确保将字符串 /sites/subsitename/documents/filename.txt 也传递给 SaveBinaryDirect,因此相对于 SPSite 而不是您使用 ClientContext 连接的子站点。

于 2011-01-02T23:38:24.510 回答
1
于 2015-08-27T10:12:30.613 回答
0

在我的情况下,文件是使用 SaveBinaryDirect 上传到打开版本控制的库中。如果未签入该文件,则任何后续尝试上传较新版本都将导致 409 错误。确保在打开版本控制后在上传后签入。

    var clientContext = (ClientContext)file.Context;
    destinationWebContext.Load(destinationList, d => d.ParentWebUrl);
    destinationWebContext.Load(destinationList, d => d.RootFolder.ServerRelativeUrl);
    clientContext.Load(file, f => f.ServerRelativeUrl);
    clientContext.Load(file, f => f.Name);

    if (clientContext.HasPendingRequest)
       clientContext.ExecuteQueryRetry();

    if (destinationWebContext.HasPendingRequest)
        destinationWebContext.ExecuteQueryRetry();

    var location = string.Format("{1}/{2}", destinationList.ParentWebUrl, destinationList.RootFolder.ServerRelativeUrl, file.Name);
    var fileInfo = File.OpenBinaryDirect(clientContext, file.ServerRelativeUrl);
    File.SaveBinaryDirect(destinationWebContext, location, fileInfo.Stream, overwrite);

    File newFile = destinationWebContext.Web.GetFileByServerRelativeUrl(location);
    newFile.CheckIn("Checked in by provisioning service", Microsoft.SharePoint.Client.CheckinType.MajorCheckIn);
    destinationWebContext.ExecuteQuery();
于 2018-10-31T18:23:22.413 回答