我正在使用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);
}
我做错了什么?
答案 0 :(得分:8)
这里的问题是我上传的网站是一个子网站,而不是sharepoint的根。我不知道这是否是一个“设计”选择,但似乎你必须使用sharepoint的根目录为ClientContext,至少在这种特殊情况下。
工作代码:
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);
}
答案 1 :(得分:7)
尝试通过SharePoint 2010客户端对象模型上传文件时,我也遇到了409错误。确保您将文件上传到完全的路径存在。该调用不会创建任何(子)文件夹。如果您将ClientContext连接到根子网站或直接连接到子网站,则无关紧要。只需确保您始终向SaveBinaryDirect方法提供要上传到的位置的SPSite相对URL。
例如,如果您将ClientContext连接到http://somesite/sites/subsitename,请确保您还将字符串/sites/subsitename/documents/filename.txt传递给SaveBinaryDirect,因此相对于SPSite而不是子网站您正在使用ClientContext连接。
答案 2 :(得分: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();