You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Graph API生成适配addFileAttachmentAsync的OneDrive共享链接问题

解决Office.js添加Graph生成的OneDrive共享链接作为附件报错的问题

我来帮你梳理下问题的根源和可行的解决方案:

首先,你注意到的?e=xxx参数是SharePoint/OneDrive的访问验证令牌,用于确认链接的有效性和使用场景。手动生成的共享链接默认会自动添加这个参数,但Graph API的createLink接口在生成永久匿名链接时(未设置过期时间),不会附带这个参数。另外,你给Graph生成的链接直接追加&download=1还存在URL格式错误——因为链接本身没有查询参数,直接用&会导致URL无效,应该用?开头。

下面是三个可行的解决方案:

方案1:修复URL格式问题

先判断链接是否已包含查询参数,再决定用?还是&来拼接download=1

let _fileName = 'Picos de Europa';
// Graph生成的共享链接
let _fileUrl = 'https://softmakersbv-my.sharepoint.com/:i:/g/personal/tim_softmakers_nl/EVh7baaf3C9Eklnq4PCDyv8BbjtwqSi-a92qYg0EYEE0kA';

// 正确拼接下载参数
const downloadSuffix = _fileUrl.includes('?') ? '&download=1' : '?download=1';
const attachmentUrl = _fileUrl + downloadSuffix;

Office.context.mailbox.item.addFileAttachmentAsync(attachmentUrl, _fileName, {}, (result) => { 
  console.log(result);
});

这个方案能解决URL格式错误的问题,但部分场景下可能还是会因为缺少e参数遇到权限验证问题,此时可以结合方案2。

方案2:让Graph生成带e参数的临时共享链接

当你给createLink接口添加expirationDateTime参数(设置链接过期时间)时,Graph会生成带有?e=xxx参数的临时共享链接,和手动生成的链接格式完全一致。

调用Graph API的示例请求:

POST https://graph.microsoft.com/v1.0/me/drive/items/01ATENY5KYPNW2NH64F5CJEWPK4DYIHSX7/createLink
Content-Type: application/json

{
  "type": "edit",
  "scope": "anonymous",
  "expirationDateTime": "2025-12-31T23:59:59Z"
}

返回的link.webUrl会带有?e=xxx参数,此时你直接追加&download=1即可正常使用addFileAttachmentAsync,和手动生成的链接逻辑完全一致。

方案3:直接获取匿名下载链接

通过Graph API直接获取文件的匿名下载链接,无需手动拼接参数:

  1. 先用createLink生成匿名共享链接,得到webUrl
  2. webUrl进行URL编码(注意要添加u!前缀)
  3. 调用/shares/{encoded-url}/driveItem/content端点,响应头的Location就是直接下载链接

示例代码:

let _fileName = 'Picos de Europa';
const yourAccessToken = '你的Graph访问令牌';
// Graph生成的共享链接
const webUrl = 'https://softmakersbv-my.sharepoint.com/:i:/g/personal/tim_softmakers_nl/EVh7baaf3C9Eklnq4PCDyv8BbjtwqSi-a92qYg0EYEE0kA';

// 编码共享链接(必须添加u!前缀)
const encodedUrl = encodeURIComponent(`u!${webUrl}`);

fetch(`https://graph.microsoft.com/v1.0/shares/${encodedUrl}/driveItem/content`, {
  headers: { Authorization: `Bearer ${yourAccessToken}` }
})
.then(response => {
  const downloadUrl = response.headers.get('Location');
  // 使用直接下载链接添加附件
  Office.context.mailbox.item.addFileAttachmentAsync(downloadUrl, _fileName, {}, (result) => { 
    console.log(result);
  });
})
.catch(err => console.error('获取下载链接失败:', err));

这个方法获取的链接是原生的下载链接,兼容性最好,不需要担心参数拼接问题。


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

火山引擎 最新活动