【问题标题】:C# SharePoint CSOM change file properties after upload上传后 C# SharePoint CSOM 更改文件属性
【发布时间】:2020-09-17 13:58:10
【问题描述】:

我已经搜索并找到了几个如何执行此操作的示例,但我无法让它们起作用 - 有一部分不起作用。 我可以执行文件上传,但以下更改属性的尝试失败。

我正在尝试从 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 都是相同的?

我希望有人可以帮助我 - 谢谢:)

【问题讨论】:

  • 我也尝试过添加 context.ExecuteQuery();最后,但没有区别。
  • 另外,澄清一下 - 文件已上传并在浏览该位置时在浏览器中可见。由于找不到文件,只有更改属性的尝试才会失败。

标签: sharepoint sharepoint-online csom file-properties


【解决方案1】:

好的,我找到了解决问题的方法。我不知道为什么这会更好,它就是这样。 据我所知,我正在做同样的事情,只是以另一种方式 - 也许其他人比我更了解 SharePoint(这并不多)可以解释为什么这有效,而我发布的第一个示例没有.

在显示的代码之前,我确保 不以“/”结尾, 不以“/”开头或结尾,并且 不以“/”开头或结尾“/”。 使用下面的代码,我可以上传文件并更新属性,在我的情况下,我更改了“标题”和自定义列“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结构应该是siteurl/libraryname/filename,我看到上面的代码sn-p,newFile现在应该是有效的。很高兴听到这个消息,您现在可以接受作为答案,这样它也可以帮助论坛中的其他人:-)
【解决方案2】:

确保在这种情况下文件服务器相对 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();
            }

【讨论】:

  • 我的相对 url 是正确的 - 它在代码中用于创建文件,我把它写出来只是为了检查它是否正确。但我会尝试使用完整路径方法,看看是否有什么不同。
  • 好的,我现在尝试了这种方法,结果是一样的,文件上传好了,但是之后找不到文件。我使用相同的 ClientContext 来检索用于在代码中较高位置创建它的文件进行编辑是否有问题? - 我没有创建新的 ClientContext 而是重用我已经拥有的。
  • @Aidal,上传文件和获取文件的ClientContext应该是一样的。
猜你喜欢
  • 2019-07-07
  • 2022-06-22
  • 2021-05-22
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多