我正在构建一个客户端,以使用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?还是有一个更简单的解决方案,以便我可以像处理用户驱动器中的文件一样处理共享文件?
答案 0 :(得分:1)
实际上,似乎不支持这种基于路径的寻址。但是可以考虑使用以下选项
选项1
将单个请求拆分为以下子请求:
shareId
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;
}
}