Доступ к общему файлу / папке по относительному пути - PullRequest
0 голосов
/ 28 сентября 2019

Я создаю клиент для доступа к файлам в OneDrive пользователя, используя MSGraph SDK (для .net, работающий на Android).

Я рассчитал sharedId, чтобы получить доступ к

client.Shares[shareId].Root.Children
                .Request()
                .GetAsync()

где shareId - это строка в форме u!aHR0cHM6Ly8xZHJ2Lm1zL2YvcyFBdHVBTV9OYWN3VmFoaUZwdU1HU19CaVFDd1d1 (рассчитывается, как описано в Документация API

Теперь я хотел бы перечислить содержимое подпапки, поэтому я вызываю

client.Shares[shareId].Root.ItemWithPath("subfolder").Children
                .Request()
                .GetAsync()

где "подпапка" - это имя существующей подпапки.

Однако я получаю Resource not found for the segment 'root' при вызове ItemWithPath().

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

Является ли это ограничением, и нужно ли мне хранить driveItemId для каждого общего файла, к которому я хочу получить доступ? Или есть более простое решение, позволяющее обрабатывать общие файлы так же, как файлы на диске пользователя?

1 Ответ

0 голосов
/ 29 сентября 2019

Действительно, похоже, что этот тип адресации на основе пути не поддерживается.Но вместо этого можно рассмотреть следующие варианты

Вариант 1

Разделить один запрос на следующие подзапросы:

  • get parent папка по shareId: GET / shares / {shareId} / root
  • получить элементы подпапки, предоставив DriveItem.Id родительской папки вместе с Drive.Id из предыдущего запроса: GET /drives/{drive-id}/items/{parent-item-id}:/{sub-folder-name}:/children

Вот пример:

var parentDriveItem = await graphClient.Shares[shareId].Root
     .Request()
     .GetAsync();


var items = await graphClient.Drives[parentDriveItem.ParentReference.DriveId].Items[parentDriveItem.Id]
    .ItemWithPath(subFolderName)
     .Children
     .Request()
     .GetAsync();

     //print results
     foreach (var item in items)
     {
          Console.WriteLine(item.Name);
     }

Опция 2

Идея состоит в том, чтобы обратиться к элементу привода с помощью , генерируя общий доступтокен для подпапки .
Учитывая реализацию для кодирования URL-адреса общего доступа, давайте также введем метод (UrlDecode) для его декодирования обратно:

public static class SharingUtility
{
    public static string UrlEncode(string value)
    {
        var base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value));
        return "u!" + base64Value.TrimEnd('=').Replace('/','_').Replace('+','-');
    }

    public static string UrlDecode(string encodedValue)
    {
        var safeEncodedValue = encodedValue.Replace('_','/').Replace('-','+').Substring(2) + "==";
        var bytes = System.Convert.FromBase64String(safeEncodedValue);
        var value = System.Text.Encoding.UTF8.GetString(bytes);
        return value;
    }
}

Теперь токен общего доступа может быть сгенерирован на основе токена общего доступа для родительской папки:

var parentShareId = SharingUtility.UrlEncode(sharingUrl); //refers to parent folder
//generate share id for sub folder
var shareId = SharingUtility.UrlEncode(SharingUtility.UrlDecode(parentShareId) + "/" + subFolderName);  
//address shared drive item 
var items = await graphClient.Shares[shareId].Root.Children
            .Request()
            .GetAsync();

foreach (var item in items)
{
    Console.WriteLine(item.Name);
}
...