Bot Framework Composer中Teams渠道如何获取上传文件的大小?
Teams渠道获取附件文件大小的替代方案
问题根源
Teams里Bot收到的附件默认不带文件大小字段,你调用SharePoint的/_api/web/getFileByServerRelativeUrl(...)返回403,是因为Bot的服务主体身份没有被授予对应SharePoint站点的访问权限——这个接口需要站点级的读写权限,而默认Bot权限不覆盖这块。
无需用户授权的替代方案
1. 用HEAD请求附件URL拿文件头
Teams附件的contentUrl就是直接的下载链接,你可以给这个链接发一个HEAD请求,从响应头的Content-Length字段直接拿到文件字节大小。这个操作不需要用户授权,只要Bot和附件同租户就能访问。
- 注意点:如果是超大文件,可能会采用分块传输,这时
Content-Length可能为空。你可以通过响应头里的Content-Range计算文件大小,或者退而求其次用GET请求(但不推荐,会消耗较多带宽)。
2. 调用Teams Bot的官方GetAttachmentInfo接口
这是Bot Framework专为Teams提供的接口,用Bot自身的身份就能调用,完全不需要用户授权,可直接获取附件元数据(包括文件大小)。
- 调用方式:
接口地址:https://smba.trafficmanager.net/apis/v3/attachments/{attachmentId}/views/metadata- 把
{attachmentId}替换为附件对象里的id值 - 请求头需带上Bot的JWT令牌(用Bot的App ID和Secret生成)
- 响应里会直接返回
size字段,即为文件大小
- 把
关于SharePoint API的补充
如果一定要用SharePoint的REST API,你需要手动给Bot的服务主体添加对应SharePoint站点的读取权限,但这个操作需要管理员配置,远不如上面两个方案便捷。
总结
优先使用GetAttachmentInfo接口,官方原生支持,可靠且无需用户授权;如果这个接口有问题,再尝试HEAD请求的方式。Graph API确实能实现需求,但要么需要用户授权,要么需要配置应用权限,不符合你的需求,所以上述两种方案更合适。
内容的提问来源于stack exchange,提问作者DZW
相关产品推荐
相关产品推荐

