使用Microsoft Graph通过共享链接获取driveItem并下载文件遇错求助
一、共享链接的正确编码方法
Graph API的/shares端点不认直接encodeURIComponent处理的链接,必须按以下规则编码:
- 把原共享链接转成UTF-8格式的字符串
- 对字符串做Base64编码
- 替换Base64里的特殊字符:
/换成_,+换成-,去掉末尾的= - 最后加前缀
u!
Node.js里的实现代码:
function encodeShareLink(originalLink) { const utf8Buffer = Buffer.from(originalLink, 'utf8'); let base64Str = utf8Buffer.toString('base64'); // 替换字符并清理末尾等号 base64Str = base64Str.replace(/\//g, '_').replace(/\+/g, '-').replace(/=+$/, ''); return `u!${base64Str}`; } // 调用示例 const rawLink = 'https://contoso.sharepoint.com/:w:/s/SpecificDriveID/Edhg68JjvxFJgVbM-ptRUi8BR55YOzdIcIxiVvujNc-Z1Q?e=qCStAr'; const validShareId = encodeShareLink(rawLink);
用这个validShareId拼接API请求地址:
GET https://graph.microsoft.com/v1.0/shares/${validShareId}/driveItem
二、下载文件内容
拿到driveItem数据后,直接用它的@microsoft.graph.downloadUrl属性下载即可,Node.js示例:
const fs = require('fs'); const axios = require('axios'); // 假设已获取到driveItem对象 async function downloadFile(driveItem) { const downloadUrl = driveItem['@microsoft.graph.downloadUrl']; const res = await axios.get(downloadUrl, { responseType: 'stream' }); res.data.pipe(fs.createWriteStream('./target-file.ext')); }
三、匹配共享链接与已有driveItem
如果你已经有了某个driveItem的数据,要确认它对应你的共享链接,可以这么做:
- 调用
GET /drives/{driveId}/items/{itemId}/createLink生成同权限的共享链接,对比核心路径(忽略末尾的e=参数,这个是随机生成的) - 查看
driveItem.shared.links属性,里面会列出该文件所有已存在的共享链接,直接匹配你手里的链接即可
内容的提问来源于stack exchange,提问作者Dan Morgan
相关产品推荐
相关产品推荐

