如何使用Microsoft Graph API从OneDrive for Business定时下载文件
从OneDrive for Business批量下载文件的实现步骤
一、解析你的OneDrive for Business地址
你提供的地址https://XXXXXXX-my.sharepoint.com/personal/AA_BBBB_com/_layouts/15/onedrive.aspx包含两个核心信息:
- 租户标识:
XXXXXXX(租户的SharePoint域名前缀) - 用户唯一ID:
AA_BBBB_com(由用户UPN转换而来,原格式应为AA@BBBB.com,将@和.替换为_)
二、通过MSAL获取Graph API访问令牌
你的APP属于后台服务类场景,适合用客户端凭据流获取令牌,步骤如下(以C#为例):
- 初始化MSAL客户端:
var clientId = "你的client_id"; var clientSecret = "你的client_secret"; var tenantId = "XXXXXXX.onmicrosoft.com"; // 也可直接使用租户ID var scopes = new[] { "https://graph.microsoft.com/.default" }; var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithTenantId(tenantId) .Build(); var result = await app.AcquireTokenForClient(scopes).ExecuteAsync(); var accessToken = result.AccessToken;
- 权限配置:需在Azure AD中给应用分配
Files.Read.All或Sites.Read.All的应用权限(非委派权限),并完成管理员同意。
三、用Graph API定位目标文件
OneDrive for Business的文件在Graph API中关联用户的drive资源,可通过两种方式定位:
方式1:通过文件路径
若知道文件在OneDrive中的相对路径(如/Documents/报表/2024Q1.xlsx),调用接口:
GET https://graph.microsoft.com/v1.0/users/AA@BBBB.com/drive/root:/Documents/报表/2024Q1.xlsx Authorization: Bearer {accessToken}
(将AA_BBBB_com还原为用户真实UPNAA@BBBB.com)
方式2:通过文件ID
若已获取文件ID,直接调用:
GET https://graph.microsoft.com/v1.0/users/AA@BBBB.com/drive/items/{fileId} Authorization: Bearer {accessToken}
四、下载文件
从返回的文件元数据中提取@microsoft.graph.downloadUrl字段,该链接是预授权的临时下载地址,直接发起GET请求即可:
GET {downloadUrl} Authorization: Bearer {accessToken}
关键注意事项
- 必须确保Azure AD应用已获得足够权限并完成管理员同意,否则会触发权限不足错误。
- 客户端凭据流无需用户登录,完全适配后台定期自动下载的场景。
- 如需批量下载,可先调用
GET https://graph.microsoft.com/v1.0/users/AA@BBBB.com/drive/root:/目标文件夹路径:/children获取文件夹下所有文件元数据,再逐个发起下载请求。
内容的提问来源于stack exchange,提问作者digi philos
相关产品推荐
相关产品推荐

