Получить файлы из SharePoint Online / 365 - PullRequest
0 голосов
/ 04 октября 2019

Я новичок в SharePoint, и я понимаю, что есть несколько сообщений на эту тему, и я также прочитал их, но я все еще не уверен, как это сделать.

Я пыталсячтобы добиться этого с помощью CSOM .NET (на самом деле я предпочел использовать REST API, но вся регистрация в Azure оказалась для него самостоятельным исследованием, поэтому вместо этого я использовал управляемый код).

В любом случае, естьэто сайт SP, которому я знаю путь к "https://(server)/sites/Pictures/".. Это место (сайт, список, папка или как он там называется) содержит несколько изображений, которые я хотел бы иметь в списке и, возможно, загрузить.

Выполнение следующих действий дает мне имя: "Pictures", Count: 393 и ServerRelativeUrl: "/sites/Pictures/Pictures".

    using (ClientContext ctx = new ClientContext(site_url))
    {
        ctx.Credentials = new SharePointOnlineCredentials(usr, secure_pwd);

        Web web = ctx.Web;

        List lst_pictures = web.Lists.GetByTitle("Pictures");

        ctx.Load(lst_pictures.RootFolder);

        ctx.ExecuteQuery();

        Console.WriteLine("Name: " + lst_pictures.RootFolder.Name);
        Console.WriteLine("ItemCount: " + lst_pictures.RootFolder.ItemCount);
        Console.WriteLine("ServerRelativeUrl: " + lst_pictures.RootFolder.ServerRelativeUrl);
    }

С этого момента я попытался перечислить несколько вещейи циклически перебираю файлы, но что бы я ни пытался, я получаю одно и то же исключение, говорящее, что коллекция не была инициализирована, и я не могу понять, что это правильно.

Тогда у меня есть триd, чтобы посмотреть, смогу ли я как-нибудь получить помощь, используя U2U CAM Query Builder и CAML Designer для SharePoint, но ни один из этих инструментов не отображает нужный мне сайт (или список, или папку) Изображения.

IЯ думаю, что это должно быть довольно просто для тех, кто привык к не столь интуитивному способу запроса SP для ресурсов через CSOM.

Итак, кто-нибудь может подсказать мне, что я делаю отсюда,так что перечислите файлы так, чтобы их можно было загрузить (ссылка на файл должна быть в этом отношении).

Любая помощь приветствуется, спасибо.

ОБНОВЛЕНИЕ1

Я добавил предложенные вами строки, и я почти уверен, что у меня уже были эти строки в моем коде во время предыдущих тестов, но я удалил их снова, потому что это не сработало для меня- и до сих пор это не так :( Смотрите изображение здесь.

// lines not shown in the image
ctx.Load(lst_pictures.RootFolder);
ctx.Load(lst_pictures.RootFolder.Files);

ctx.ExecuteQuery();

Console.WriteLine("Name: " + lst_pictures.RootFolder.Name);
Console.WriteLine("ItemCount: " + lst_pictures.RootFolder.ItemCount);
Console.WriteLine("ServerRelativeUrl: " + lst_pictures.RootFolder.ServerRelativeUrl):

FileCollection files = lst_pictures.RootFolder.Files;

enter image description here

Первая часть работает, но перед изменением это было сделанокод.

enter image description here

ОБНОВЛЕНИЕ 2

enter image description here

ОБНОВЛЕНИЕ 3 Обновлен код согласно комментариямТем не менее, до сих пор нет.

enter image description here

enter image description here

ОБНОВЛЕНИЕ 4: решение

Что ж, получается, что настоящей проблемой был установлен пакет nuget с именем Microsoft.SharePoint.Client v.14.xxxx. Это должен был быть только что названный SharePoint.Client v.15.xxxx (у этого нет описания, но от Microsoft).

Итак, спасибо Адаму за попытку помочь мнеЯ отмечу ваш ответ как правильный, поскольку в конечном итоге он привел меня к проблеме, чтобы ее можно было исправить. Установка правильного пакета сразу же устранила проблему. enter image description here

Правильный пакет - вот этот. enter image description here

ОБНОВЛЕНИЕ 5: новая тема, настраиваемые поля / столбцы (все еще использующие CSOM)

1) У меня есть следующий код нана данный момент, но мне нужно получить некоторые дополнительные свойства (пользовательские) из файлов - что я должен добавить в код, чтобы сделать это? 2) И должен ли я использовать ListItem, а не File в этом случае? 3) И можно ли даже добавить фильтрацию по настраиваемым полям / столбцам, чтобы получать только подмножество файлов?

        using (ClientContext ctx = new ClientContext("<url>"))
        {
            ctx.Credentials = new SharePointOnlineCredentials("<usr>", "<pwd>");

            Web web = ctx.Web;

            lst = web.Lists.GetByTitle("<list name>");

            ctx.Load(lst);
            ctx.Load(lst.RootFolder);
            ctx.Load(lst.RootFolder.Folders);

            ctx.ExecuteQuery();

            files = lst.RootFolder.Files;

            foreach (File f in files)
            {
                // doing stuff with some attributes like UniqueId, Name and ServerRelativeUrl, but need custom attributes as well.
            }
        }

1 Ответ

2 голосов
/ 04 октября 2019

Пожалуйста, загрузите также файлы rootFolder в контекст, например:


    ctx.Load(lst_pictures.RootFolder.Files);

, а затем вы можете получить коллекцию файлов в корневой папке библиотеки, например:


    FileCollection fileCollection = lst_pictures.RootFolder.Files;

полный код, основанный на вашем коде, выглядит следующим образом:


    using (ClientContext ctx = new ClientContext(site_url))
    {
        ctx.Credentials = new SharePointOnlineCredentials(usr, secure_pwd);

        Web web = ctx.Web;

        List lst_pictures = web.Lists.GetByTitle("Pictures");

        ctx.Load(lst_pictures.RootFolder);

        // Load files of root folder to context
        ctx.Load(lst_pictures.RootFolder.Files);

        // after execute on context the rootFolder will be populated with file collection
        ctx.ExecuteQuery();

        Console.WriteLine("Name: " + lst_pictures.RootFolder.Name);
        Console.WriteLine("ItemCount: " + lst_pictures.RootFolder.ItemCount);
        Console.WriteLine("ServerRelativeUrl: " + lst_pictures.RootFolder.ServerRelativeUrl);

        // get the file collection of the rootfolder
        FileCollection fileCollection = lst_pictures.RootFolder.Files;
        foreach (File file in fileCollection)
        {
            Console.WriteLine($"file : {file.Name} ");
        }
    }

вывод кода выше для моей библиотеки примеров был следующим: enter image description here

Имейте в виду

, что если вы планируете использовать папки в этой библиотеке и помещать некоторые файлы в папки, такого подхода недостаточно :). Вам нужно будет сначала загрузить lst_pictures.RootFolder.Folders в контекст, а затем выполнить, после этого перед каждым набором папок и для каждой папки. Вам потребуется загрузить набор файлов этой папки, чтобы получить файлы. Итак, для подведения итогов Вам понадобится:


    ctx.Load(lst_pictures.RootFolder);
    ctx.Load(lst_pictures.RootFolder.Folders);
    ctx.ExecuteQuery();

, а затем


    FolderCollection folderCollection = lst_pictures.RootFolder.Folders;
    foreach (Folder folder in folderCollection)
    {
           ctx.Load(folder.Files);
           ctx.ExecuteQuery();
           FileCollection fileCollection = folder.Files;
           foreach (File file in fileCollection)
           {
                 Console.WriteLine($"file : {file.Name} ");
           }
    }

, но если вы планируете хранить файлы только в корневой папке библиотеки, первым кодом должен бытьТы ищешь. Я надеюсь, что этот пост будет полезен:)

PS Добро пожаловать в SharePoint.

ОБНОВЛЕНИЕ 1

Если вы хотите включить пользовательские столбцы в коллекцию файлов, их необходимо включить. Вы можете включить все пользовательские столбцы файлов, например,



    ctx.Load(list.RootFolder);
    ctx.Load(list.RootFolder.Folders);
    ctx.Load(list.RootFolder.Files, includes => includes.Include(i => i.Name, i => i.ListItemAllFields));
    ctx.ExecuteQuery();

, а затем у вас будет список всех столбцов, а также пользовательские. Таким образом, вы можете сделать foreach, например:



    FileCollection fileCollection = list.RootFolder.Files;
    foreach (File file in fileCollection)
    {
          Console.WriteLine($"file : {file.Name} ");
          Console.WriteLine($"file : {file.ListItemAllFields["SomeCustomColumn"]} ");
     }

, чтобы получить только необходимые пользовательские столбцы. Вы можете включить их один за другим, например



    ctx.Load(list.RootFolder.Files, includes => includes.Include(i => i.Name, i => i.ListItemAllFields["CustomColumn1"], i => i.ListItemAllFields["CustomColumn2"]));

, а затем для этого набора файлов. только Имя и два пользовательских столбца в коллекции.

Обратите внимание, что имена этих столбцов являются внутренними именами полей (или статическими именами), а не отображаемым именем, поэтому SharePoint, например, может изменить пространство на x0020 . Поэтому для отображаемого имени столбца, например «Пользовательский столбец 1», внутреннее имя - «Custom_x0020_Column_x0020_1», и это имя, которое вы должны использовать. Вы можете получить это имя, перейдя на страницу настроек столбца (страница редактирования), и вы увидите имя в URL в параметре Field = ....

...