如何通过Microsoft Graph API访问SharePoint权限受限的嵌套文件夹并下载文件?
我正在开发一个C#应用程序,通过Microsoft Graph API从SharePoint文档库下载文件。目前遇到权限相关的问题:当登录用户仅拥有文档库中特定嵌套文件夹的访问权限时,调用API访问该文件夹会返回空的value数组。比如用户拥有Document/Blackout文件夹权限时,代码能正常返回内容;但仅拥有Native Draft文件夹权限时,返回的value对象为空。
关键代码片段:
jsonDocument.RootElement.GetProperty("value").EnumerateArray()
API返回空value的示例截图:
完整代码如下:
public async Task<bool> DownloadDrive(CancellationToken cancellationToken) { OutputWindow.Info($"Start DownloadDrive.", _resultText); string siteId = "XXXXXXXXXXXXXXXXXXXXXXXX"; string libraryUrl = "https://XXXXXX/sites/{sitename}/Shared%20Documents"; string driveId = await GetDriveId(siteId, libraryUrl); if (string.IsNullOrEmpty(driveId)) { OutputWindow.Info($"SharePoint Library under {libraryUrl} could not be found.", _resultText); return false; } if (Directory.Exists(_localFolder)) { Directory.Delete(_localFolder, true); } Directory.CreateDirectory(_localFolder); await DownloadLibrary(driveId, _localFolder); return true; } private async Task<string> GetDriveId(string siteId, string libraryUrl) { var requestUrl = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives"; var response = await _httpClient.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); var jsonDocument = JsonDocument.Parse(responseContent); foreach (var drive in jsonDocument.RootElement.GetProperty("value").EnumerateArray()) { if (drive.GetProperty("webUrl").GetString() == libraryUrl) { return drive.GetProperty("id").GetString(); } } return null; } private async Task DownloadLibrary(string driveId, string path) { var requestUrl = $"https://graph.microsoft.com/v1.0/drives/{driveId}/root/children"; var response = await _httpClient.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); var jsonDocument = JsonDocument.Parse(responseContent); foreach (var driveItem in jsonDocument.RootElement.GetProperty("value").EnumerateArray()) { await DownloadDriveItem(driveItem, driveId, path); } } private async Task DownloadDriveItem(JsonElement driveItem, string driveId, string path) { string itemName = driveItem.GetProperty("name").GetString() ?? string.Empty; OutputWindow.Info($"{itemName}", _resultText); if (!driveItem.TryGetProperty("@microsoft.graph.downloadUrl", out var downloadUrl)) { OutputWindow.Info($"Downloading the folder {driveItem.GetProperty("webUrl").GetString()}", _resultText); var folderPath = System.IO.Path.Combine(path, driveItem.GetProperty("name").GetString()); Directory.CreateDirectory(folderPath); var requestUrl = $"https://graph.microsoft.com/v1.0/drives/{driveId}/items/{driveItem.GetProperty("id").GetString()}/children"; var response = await _httpClient.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); var jsonDocument = JsonDocument.Parse(responseContent); foreach (var childItem in jsonDocument.RootElement.GetProperty("value").EnumerateArray()) { await DownloadDriveItem(childItem, driveId, folderPath); } } else { OutputWindow.Info($"Downloading the file {driveItem.GetProperty("webUrl").GetString()}", _resultText); var filePath = System.IO.Path.Combine(path, driveItem.GetProperty("name").GetString()); var fileResponse = await _httpClient.GetAsync(downloadUrl.GetString()); fileResponse.EnsureSuccessStatusCode(); await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write); await fileResponse.Content.CopyToAsync(fileStream); } }
内容的提问来源于stack exchange,提问作者Mannan Bahelim
相关产品推荐
相关产品推荐

