通过相对路径访问共享文件/文件夹

时间:2019-09-28 05:53:11

标签: c# microsoft-graph onedrive

我正在构建一个客户端,以使用MSGraph SDK(用于.net,在Android上运行)访问用户的OneDrive中的文件。

我已经计算了sharedId,以便可以访问

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

其中shareId是u!aHR0cHM6Ly8xZHJ2Lm1zL2YvcyFBdHVBTV9OYWN3VmFoaUZwdU1HU19CaVFDd1d1形式的字符串(按the API docs所述计算

现在,我想列出子文件夹的内容,所以我打电话给

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

其中“子文件夹”是现有的子文件夹名称。

但是,我在调用Resource not found for the segment 'root'时检索了ItemWithPath()

据我所知,这种相对于另一个项目的文件访问应按照the docs on path-based-addressing进行(并且它适用于用户驱动器中的文件/文件夹,但不适用于共享中的项目)。

这是一个限制,我是否需要为每个要访问的共享文件存储driveItemId?还是有一个更简单的解决方案,以便我可以像处理用户驱动器中的文件一样处理共享文件?

1 个答案:

答案 0 :(得分:1)

实际上,似乎不支持这种基于路径的寻址。但是可以考虑使用以下选项

选项1

将单个请求拆分为以下子请求:

    通过shareId
  • 获取 parent 文件夹:GET / shares / {shareId} / root
  • 通过提供父文件夹的DriveItem.Id和上一个请求Drive.Id的{​​{1}}来获得子文件夹项目

这里是一个例子:

GET /drives/{drive-id}/items/{parent-item-id}:/{sub-folder-name}:/children

选项2

该想法是通过为子文件夹生成共享令牌来解决驱动器项
Given the implementation用于对共享URL进行编码,还介绍了一种用于对共享URL进行解码的方法(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); } ):

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;
    }
}