C# 服务器事件更改了Sharepoint上载的文件名。如何检索它?

C# 服务器事件更改了Sharepoint上载的文件名。如何检索它?,c#,sharepoint,C#,Sharepoint,我正在使用以下代码将文件上载到Sharepoint server: ClientOM.File uploadFile = null; try { string fileRef = serverRelativeURL + msg.Message.FileName; FileCreationInformation fileCreationInformation = new FileCreationInformation() { Content = msg.Conte

我正在使用以下代码将文件上载到Sharepoint server:

ClientOM.File uploadFile = null;
try {

    string fileRef = serverRelativeURL + msg.Message.FileName;
    FileCreationInformation fileCreationInformation = new FileCreationInformation() {
        Content = msg.Content,
        Url = fileRef,
        Overwrite = true
};
uploadFile = _currentList.RootFolder.Files.Add(fileCreationInformation);
_currentContext.ExecuteQuery();
并上传文件。但在服务器上,我们有一个向文件标题添加一些随机字符串的事件。因此上传后fileRef不相关

我们需要设置文件的作者。为此,我们必须检索文件并更新此属性。我使用此示例执行此操作:

string fileName = serverRelativeURL + msg.Message.FileName;
uploadFile = _currentContext.Web.GetFileByServerRelativeUrl(fileName);
_currentContext.Load(uploadFile);
uploadFile.ListItemAllFields["Author"] = _currentUser;
uploadFile.ListItemAllFields["Editor"] = _currentUser;
uploadFile.ListItemAllFields.Update();
_currentContext.ExecuteQuery();
在ExecuteQuery()上,我得到一个异常“找不到文件”。但如果我从Sharepoint复制路径(使用那个随机字符串),一切都正常

所以问题是:有没有其他方法来检索文件?以身份证为例?因为当我们上传文件时,实例“uploadFile”没有太多有用的信息。

方法1: 跟踪文件名,然后使用此代码直接检索它

    public FileInformation GetFileFromAttachment(int itemId, string filename)
    {
        FileInformation file = null;

        //continue here
        if (new FileInfo(filename).Name != null)
        {
            CSOMUtils.ExecuteInNewContext(QueryConfig.siteUrl, delegate(ClientContext clientContext)
            {
                clientContext.Credentials = QueryConfig.credentials;
                clientContext.Load(clientContext.Web, l => l.ServerRelativeUrl);
                clientContext.ExecuteQuery();


                List oList = clientContext.Web.Lists.GetByTitle(ListName);
                clientContext.ExecuteQuery();

                string url = string.Format("{0}/Lists/{1}/Attachments/{2}/{3}",
                    clientContext.Web.ServerRelativeUrl,
                    ListName,
                    itemId,
                    filename);

                var f = clientContext.Web.GetFileByServerRelativeUrl(url);
                clientContext.Load(f);
                clientContext.ExecuteQuery();

                file = File.OpenBinaryDirect(clientContext, f.ServerRelativeUrl);


            });
        }
        return file;
    }
方法2:

您可以使用ServerRelativeUrl获取包含所有附件的文件夹。

假设您有itemId和filename。当您这样做时:“var f=clientContext.Web.GetFileByServerRelativeUrl(url);”文件名在服务器端更改。所以文件名不再相关。当您执行“clientContext.Load(f);clientContext.ExecuteQuery();”时,它将抛出异常“File not found”。请仔细阅读这个问题。当您提供一个文件名时,代码就可以工作了,它正在生产中使用。据我所知,你不能下载没有文件名的文件。是特定长度的随机字符串,也许您可以将其修剪掉。我希望在“var f=clientContext.Web.GetFileByServerRelativeUrl(url);”之后。f将包含上传文件的Id(或类似的内容),我可以通过Id检索此文件(因为文件名不再相关)。文件以附件的形式存储,就像它们在windows的目录中一样,但在内容数据库中,通过这种方式,您甚至可以在其上启用BLOB存储。我认为如果您有listitem id,您可以获取所有附件并循环它们。但是您需要文件名来识别它们。这些文件本身不是列表项,因此它们没有ID。为什么不试着跟踪文件名呢?谁在乎它是不是随机生成的。。。跟踪随机生成的文件名。如果不能按照你想要的方式去做,那就做不到。