C#SharePoint CSOM在上载后更改文件属性



我已经搜索并找到了几个如何做到这一点的例子,但我无法使它们发挥作用——好吧,其中一部分不起作用。我可以执行文件上传,但以下更改属性的尝试失败。

我正试图从base64负载上传一个文件——这一部分有效——但当我之后尝试编辑与该文件相关的属性(自定义列(时,代码失败了。

以下是代码(为便于阅读而简化(:(请注意,props是具有名称和值属性的自定义对象(FileProperty(的集合(。

using (ClientContext context = new ClientContext("<sharepoint_server_url>"))
{
context.Credentials = new SharePointOnlineCredentials(<usr>,<secure_pwd>);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(<base64_content>)))
{
File.SaveBinaryDirect(context, <relative_path>, ms, true);
}
// file is uploaded - so far so good!
// attempt to edit properties of the file.
if (props != null)
{
if (props.Count > 0)
{
File newFile = context.Web.GetFileByServerRelativeUrl(<relative_path>);
context.Load(newFile);
context.ExecuteQuery();
newFile.CheckOut();
ListItem item = newFile.ListItemAllFields;
foreach (FileProperty fp in props)
{
item[fp.name] = fp.value;                                
}
item.Update();
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
}
}
}

这段代码在我尝试更新属性的部分引发了一个异常。消息:找不到文件

有人能告诉我这个例子有什么问题吗?或者提供另一个如何做到这一点的例子吗?

此外,还有一个问题-是否有一种方法可以通过唯一的ID来寻址文件,无论文件位于或移动到SharePoint服务器的何处,该ID都是相同的?

我希望有人能帮我-谢谢:(

好的,我找到了问题的解决方案。我不知道为什么这个效果更好,只是确实如此。据我所知,我正在做完全相同的事情,只是以另一种方式——也许其他比我更了解SharePoint的人(这并不多(可以解释为什么这是有效的,而我发布的第一个例子却没有。

在所示代码之前,我确保<site_url>并不是以"/"并且<library_name>不以"/"并且<文件名>不以"/&";。使用下面的代码,我可以上传一个文件并更新属性,在我的情况下,我更改了";标题";以及自定义列";CustCulomnA";它起作用了。

using (ClientContext context = new ClientContext(<site_url>))
{
context.Credentials = new SharePointOnlineCredentials(<usr>, <secure_pwd>);
FileCreationInformation fci = new FileCreationInformation()
{
Url = <file_name>,
Content = Convert.FromBase64String(<base64_content>),
Overwrite = true
};
Web web = context.Web;
List lib = web.Lists.GetByTitle(<library_name>);
lib.RootFolder.Files.Add(fci);
context.ExecuteQuery();
response.message = "uploaded";
if (props != null)
{
if (props.Count > 0)
{
File newFile = context.Web.GetFileByUrl(<site_url> +"/"+ <library_name> + "/" + <file_name>);
context.Load(newFile);
context.ExecuteQuery();
newFile.CheckOut();
ListItem item = newFile.ListItemAllFields;
foreach (FileProperty fp in props)
{
item[fp.name] = fp.value;
}
item.Update();
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
context.ExecuteQuery();

在这种情况下,请确保文件服务器的相对url有效。

例如,如果完整的url是:

https://zheguo.sharepoint.com/sites/test/Shared%20Documents/test.jpg

那么相对url应该是

/sites/test/Shared%20Documents/test.jpg

您也可以使用GetFileByUrl方法,传递完整的文件url,如下所示:

clientContext.Credentials = new SharePointOnlineCredentials(userName, securePassword);
Web web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
File file = web.GetFileByUrl("https://zheguo.sharepoint.com/sites/test/Shared%20Documents/test.jpg");
clientContext.Load(file);
clientContext.ExecuteQuery();
file.CheckOut();
ListItem item = file.ListItemAllFields;
item["Title"] = "Test";
item.Update();
file.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
clientContext.ExecuteQuery();
}

相关内容

  • 没有找到相关文章

最新更新