CSOM Обновить файл метаданных документа в подпапке библиотеки. Получение файла ошибки не найден - PullRequest
0 голосов
/ 03 октября 2019

У меня есть список URL-адресов, которые являются документами в подпапке библиотеки.

Когда я иду, чтобы обновить метаданные документа в библиотеке, но не в подпапке, код работает как положено.

Но некоторые документы в списке находятся в подпапке. URL имеет полный путь к этому документу, который включает в себя подпапку.

Я могу вставить URL-адрес в браузер и открыть документ, чтобы я знал, что он правильный, но когда я попадаю на

context.Load (file, f.ListItemsAllFields);Context.ExecuteQuery ();- Ошибка происходит по URL-адресу файла в подпапке

Я получаю сообщение об ошибке «Файл не найден».

См. Код ... Опять работает, если файл находится в корне библиотеки, но только некогда файл находится в подпапке.

    /// <summary>
    /// Updates SharePoint MetaData for a specific document
    /// </summary>
    /// <param name="urlfilepath">The URL including file name of the file to be updated</param>
    /// <param name="values">this is a dictionary of propertyName and value to be updated.</param>
    private void UpdateMetaData(string urlfilepath, string library,Dictionary<string, string> mydictionary)
    {
        using (var context = new ClientContext(qsURLSite))
        {
            context.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
            var web = context.Web;

            // Get drop off library and edit all items without making changes
            context.Load(web, w => w.Lists);
            context.ExecuteQuery();

            List dropOffLibrary = web.Lists.GetByTitle(library);


            context.Load(dropOffLibrary, dl => dl.RootFolder.Files);
            context.ExecuteQuery();

            var file = dropOffLibrary.RootFolder.Files.GetByUrl(urlfilepath);

            context.Load(file, f => f.ListItemAllFields);
            context.ExecuteQuery();

            Microsoft.SharePoint.Client.ListItem newItem = file.ListItemAllFields;


            foreach (KeyValuePair<string, string> entry in mydictionary)
            {
                // entry.Key has to be in the property list of that document
                // the name is very specific
                try
                {
                    newItem[entry.Key] = entry.Value;
                }
                catch
                {
                    // Key was not found in list
                    // go to next key

                }
            }
            newItem.Update();
            //file.Update();
            context.Load(file);
            context.ExecuteQuery();

            context.Load(dropOffLibrary, dl => dl.RootFolder.Files);
            context.ExecuteQuery();
        }
    }

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Вот что я закончил тем, что начал работать.

eq - это короткий идентификатор EQCode для записи в моем коде.

/// <summary>
      /// This procedure uploads documents to the Authorizations Library
      /// </summary>
      /// <param name="filename">File Being Uploaded</param>
      /// <param name="p">file in bytes</param>
      /// <param name="library">Library to upload to</param>
      /// <returns></returns>
        private string UploadToSharePoint(string filename, byte[] p,string library)  //p is path to file to load
        {
            string newUrl;
            string siteUrl = string.Empty; 


            siteUrl = qsURL + @"/repository/current/";
            // Calculate block size in bytes.
            int blockSize = fileChunkSizeInMB * 1024 * 1024;

            //Insert Credentials

             Microsoft.SharePoint.Client.ClientContext context = new Microsoft.SharePoint.Client.ClientContext(siteUrl);

            context.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
            Microsoft.SharePoint.Client.Web site = context.Web;

            if (context.HasPendingRequest)
                context.ExecuteQuery();

            try
            {

                //Get the required RootFolder
                string barRootFolderRelativeUrl = library;

                // Getting Folder List to see if EQCode Folder Exists  If not create it.

                string eq = txtEQCode.Text;
                FolderCollection folders = site.GetFolderByServerRelativeUrl(barRootFolderRelativeUrl).Folders;   //list.RootFolder.Folders;
                context.Load(folders, fl => fl.Include(ct => ct.Name)
                .Where(ct => ct.Name == eq));
                context.ExecuteQuery();

                if (folders.Count < 1)  // Create Folder because it does not exist on SharePoint Library
                {
                    folders.Add(eq);
                    context.ExecuteQuery();
                }

                Microsoft.SharePoint.Client.Folder barFolder = site.GetFolderByServerRelativeUrl(barRootFolderRelativeUrl);
                Microsoft.SharePoint.Client.Folder currentRunFolder = site.GetFolderByServerRelativeUrl(barRootFolderRelativeUrl + "/" + eq);

                //Microsoft.SharePoint.Client.FileCreationInformation newFile = new Microsoft.SharePoint.Client.FileCreationInformation { Content = p, Url = filename, Overwrite = true };
                //Microsoft.SharePoint.Client.File uploadFile = currentRunFolder.Files.Add(newFile);

                MemoryStream stream = new MemoryStream(p);

                FileCreationInformation flciNewFile = new FileCreationInformation();

                // This is the key difference for the first case – using ContentStream property
                flciNewFile.ContentStream = stream;
                flciNewFile.Url = System.IO.Path.GetFileName(fixInvalidCharactersInFileName(filename));
                flciNewFile.Overwrite = false;
                Microsoft.SharePoint.Client.File uploadFile = currentRunFolder.Files.Add(flciNewFile);

                currentRunFolder.Update();
                context.Load(uploadFile);
                context.ExecuteQuery();

                newUrl = siteUrl + barRootFolderRelativeUrl + "/" + filename;

                // Set document properties
                // Have to check out document to upldate properties.

                uploadFile.CheckOut();

                Microsoft.SharePoint.Client.ListItem listItem = uploadFile.ListItemAllFields;

                // Sets up ListItem fields based on Content Type 
                // as each content type has a different set of Required Fields.

                SetUpListItems(listItem, EQCode);

                listItem["Title"] = filename;
                listItem.Update();

                uploadFile.CheckIn("File Uploaded Manually added metadata", Microsoft.SharePoint.Client.CheckinType.MinorCheckIn);
                context.ExecuteQuery();

                //Return the URL of the new uploaded file
                return newUrl;
            }
            catch (Exception e)
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Error Uploading!", "alert('" + e.Message + "');", true);
                return "FALSE";
            }
        }
0 голосов
/ 04 октября 2019

list.RootFolder.Files.GetByUrl просто верните файл в корневую папку, вместо него вы можете использовать web.GetFileByServerRelativeUrl.

Web web = context.Web;
                var list = web.Lists.GetByTitle("MyDoc3");
                var file1 =web.GetFileByServerRelativeUrl("/sites/lee/MyDoc3/ParentFolder/test2.docx");                
                var file2 = list.RootFolder.Files.GetByUrl("/sites/lee/MyDoc3/test.pptx");
                context.Load(file1);
                context.Load(file2);
                context.ExecuteQuery();
...