You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Document ID调用Microsoft Graph下载SharePoint存储的文档

解决方案

1. 核心字段确认

SharePoint的Document ID固定存储在文档库列表项的_dlc_DocId字段中,该字段为系统内置字段,启用Document ID功能后自动生成,无需额外配置。
你之前查询失败是因为DriveItem的search接口默认不包含该自定义字段的检索范围,需要通过列表项查询接口筛选。

2. 可行实现方案

方案1:通过Microsoft Graph列表筛选查询(推荐)

直接调用站点下的列表项接口,按_dlc_DocId筛选,可直接获取关联的driveItem信息:

  1. 先获取目标站点的ID,若需要全站/跨站检索,可先遍历所有站点ID
  2. 调用接口获取站点下所有文档库ID:GET /sites/{站点ID}/lists?$filter=template eq 'documentLibrary'&$select=id
  3. 遍历每个文档库,执行筛选查询:GET /sites/{站点ID}/lists/{文档库ID}/items?$expand=fields&$filter=fields/_dlc_DocId eq '你的Document ID值'&$select=id,driveItem
  4. 返回结果中的driveItem字段就包含文件的下载地址、存储路径、名称等所有你需要的信息,直接用你现有的下载逻辑处理即可。

方案2:修复DocIdRedir.aspx重定向403问题

你之前curl请求403是因为没有携带合法的应用权限令牌,请求时在Header中添加Authorization: Bearer {你的应用权限access_token}即可正常获取302重定向地址,从重定向地址中可解析出文件的实际存储路径。
注意令牌需要配置Sites.Read.All或更高的应用权限,且已经过管理员同意。

3. PHP实现示例(基于microsoft-sdk-php)

<?php
// 替换为你自己的配置
$siteId = "xxxxxx.sharepoint.com,xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
$targetDocId = "XXXXXXX-2222222222-86";
$accessToken = "你的应用权限访问令牌";

// 初始化已配置好的Graph客户端实例
$graph = new Microsoft\Graph\Graph();
$graph->setAccessToken($accessToken);

// 获取当前站点所有文档库
$lists = $graph->createRequest("GET", "/sites/$siteId/lists?\$filter=template eq 'documentLibrary'&\$select=id")
    ->execute()
    ->getBody()['value'];

$targetDriveItem = null;
foreach ($lists as $list) {
    // 按Document ID筛选当前文档库下的条目
    $items = $graph->createRequest("GET", "/sites/$siteId/lists/{$list['id']}/items?\$expand=fields&\$filter=fields/_dlc_DocId eq '$targetDocId'&\$select=id,driveItem")
        ->execute()
        ->getBody()['value'];
    if (!empty($items)) {
        $targetDriveItem = $items[0]['driveItem'];
        break;
    }
}

if ($targetDriveItem) {
    // 拿到下载地址后执行原有下载逻辑
    $downloadUrl = $targetDriveItem['@microsoft.graph.downloadUrl'];
    file_put_contents("本地存储路径/".$targetDriveItem['name'], fopen($downloadUrl, 'r'));
}
?>

注意事项

  • 必须配置应用类型的Sites.Read.All或Sites.ReadWrite.All权限,且完成管理员全局同意,委派权限无法满足静默检索全站文档的需求
  • 如果需要跨所有站点检索,可先调用GET /sites接口获取租户下所有站点ID,再依次遍历每个站点下的文档库即可

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:54:04