sharepoint - 上传后 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> 不以“/”开头或结尾,并且 <file_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();
推荐阅读
- python - tensorflow session.run() 方法如何知道占位符变量的名称?
- python - OSError:在pyspark中将sqldataframe转换为pandas数据帧时参数无效
- javascript - 如何等待/检查元素是否存在
- swift - 谷歌地图 SDK 错误
- python - Pandas Dataframe Groupby 多列
- jquery - 选中单选按钮时获取文本框的值并根据文本框值更改单选按钮的值
- javascript - 如何通过按键盘输入角度 6 将光标从一个输入移动到另一个输入和按钮
- javascript - 如何在 JavaScript 中实现这个加密相关的代码?
- python-3.x - h2o vs scikit 学习混淆矩阵
- database - Cassandra写一致性级别ALL说明