【问题标题】:Office 365 MyFiles API - How to get the Folder object using Id string from One DriveOffice 365 MyFiles API - 如何使用一个驱动器中的 Id 字符串获取文件夹对象
【发布时间】:2016-03-29 17:22:23
【问题描述】:

我不喜欢从 OneDrive 获取特定文件夹对象。我希望根据用户正在查看的文件夹生成面包屑路径。

为了开始,我正在实例化SharePointClient,它以用户根文件夹为目标,如下所示:

var spClient = await AuthenticationHelper.EnsureSharePointClientCreatedAsync("MyFiles");

然后我像这样获取根文件和文件夹:

var rootFiles = await spClient.Files.ExecuteAsync();
var files = rootFiles.CurrentPage;

如果用户点击一个文件夹,我会像这样获取该文件夹的文件和文件夹:

var folderFiles = await spClient.Files[selectedItemID].ToFolder().Children.ExecuteAsync();
var files = folderFiles.CurrentPage;

在这种情况下,selectedItemID 只是用户选择的文件夹的Id 属性。

至于我遇到的问题是获取文件夹对象本身。我不断收到此错误:

Expected a relative URL path without query or fragment.
Parameter name: entitySetName

当我尝试执行以下操作之一时:

// first attempt
var folder = await spClient.Files[selectedItemID].ToFolder().ExecuteAsync();

// second attempt - which is the same as first attempt with use of GetById()
var folder = await spClient.Files.GetById(selectedItemID).ToFolder().ExecuteAsync();

// third attempt - which is the same as second attempt without chaining
var thisItemFetcher = spClient.Files.GetById(selectedItemID);
var thisFolderFetcher = thisItemFetcher.ToFolder();
var myFolder = await thisFolderFetcher.ExecuteAsync();
var folder = myFolder as Microsoft.Office365.SharePoint.FileServices.Folder;

如果我在查找文件时执行任何这些尝试,我会得到文件对象没有问题。

当然,我尝试查找此错误,但我没有找到任何地方。

我想做的很简单。我只需要返回一个简单对象列表

{
    FolderID = folder.Id,
    FolderName = folder.Name,
}

对于用户当前正在查看的文件夹以及每个父文件夹直到根文件夹。

我知道我可以根据folder.ParentReference.Id 属性递归地执行此操作。

现在您可能会想,为什么不能从用户正在查看的文件夹中请求文件和文件夹的列表?当然,基于任何返回的文件或文件夹.ParentReference.Id,您可以进行递归。那么这个问题的答案就是:如果文件夹是空的会发生什么?

有人能解释一下我在这里遇到的这个简单但不那么简单的问题吗?

根据SkyDrive Folder object docs

A Folder object can be returned as part of:
/FOLDER_ID/files
/me/skydrive/files
/me/skydrive/shared/files
/USER_ID/skydrive/files
/ALBUM_ID/files

但我不确定这是否也适用于 Office 365 OneDrive。

查看最新的OneDrive API,他们似乎使用了完全不同的请求结构:
GET /drive/items/{item-id}

我的SarePointClient.Drive 没有公开Items 收藏。

对于那些好奇的人,我正在使用 Microsoft Office 365 My Files Library v1.0.22 访问 OneDrive。

【问题讨论】:

    标签: api office365


    【解决方案1】:

    文档 SkyDrive 文件夹对象正在使用服务端点https://apis.live.net

    文档 OneDrive API 正在使用服务端点: https://api.onedrive.com/v1.0 (OneDrive) 或 https://{tenant}-my.sharepoint.com/_api/v2.0 (OneDrive for Business)。

    在这种情况下,您应该使用最新的 .NET OneDrive SDK:OneDrive .NET SDK 1.1.29

    如何使用 One Drive 中的 Id 字符串获取文件夹对象

    GET /drive/items/{item-id}

    oneDriveClient.Drive.Items["{item_id}"]
    

    【讨论】:

    • 正如我提到的,我实际使用的是用于 MS Office 365 的 MyFiles 库。因此,我有 SharePointClient,它通过 SharePointClient.Files 集合向我公开用户 OneDrive。我的问题专门询问如何使用SharePointClient.Files.GetById("{item_id}") 实现oneDriveClient.Drive.Items["{item_id}"]
    • @iiminov,根据文档,Office 365 Files API 已被弃用。对于 OneDrive 和 OneDrive for Business 开发,请使用 OneDrive API。这就是为什么我建议您使用 .NET OneDrive SDK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多