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

Bot Builder 4开发MS Teams机器人上传附件返回404错误问题

问题原因

从你返回的404错误日志可以直接看到,上传附件的POST请求体是空对象{},说明你传入的附件参数没有被SDK正确序列化发送,结合代码细节,共有5个直接导致错误的问题:

  • 异步方法未加await:connector.conversations.uploadAttachment是异步Promise方法,你调用时没有加await,方法还没执行完成就走到后续逻辑,也无法捕获接口真实返回的参数错误提示。
  • 变量拼写错误:接收上传返回值的变量写为responce(正确拼写为response),后续拼接附件地址时读取response.id本身就会触发未定义变量错误。
  • 上传参数字段名错误:Bot Framework附件上传接口要求的附件参数字段为contentBase64(存base64格式文件内容)、contentType(存文件MIME类型),你代码里写的是originalBase64和type,SDK无法识别这些非标准字段,序列化时直接丢弃,最终发出空请求体。
  • 文件内容格式错误:fs.readFileSync默认返回Buffer类型对象,没有手动转成base64字符串就直接传入参数,SDK序列化Buffer失败也会导致参数丢失。
  • 会话ID重复转义:你请求URL里的会话ID已经被URL编码(包含%3A类转义字符),SDK发请求时会对路径参数再次转义,导致接口路由匹配失败返回404。
修复方案

将代码替换为以下修正后的版本即可:

const fs = require('fs');
const path = require('path');

export async function getUploadedAttachment(turnContext) {
  // 读取本地文件并转换为base64字符串
  const imageBuffer = fs.readFileSync(path.join(__dirname, '../resources/image.png'));
  const imageBase64 = imageBuffer.toString('base64');

  // 创建连接器客户端
  const connectorFactory = turnContext.turnState.get(turnContext.adapter.ConnectorFactoryKey);
  const connector = await connectorFactory.create(turnContext.activity.serviceUrl);
  // 对会话ID先做一次解码,避免SDK重复转义导致路由错误
  const conversationId = decodeURIComponent(turnContext.activity.conversation.id);

  // 等待附件上传完成,使用正确的参数字段名
  const response = await connector.conversations.uploadAttachment(conversationId, {
    name: 'image.png',
    contentBase64: imageBase64,
    contentType: 'image/png'
  });

  // 拼接可直接在消息里引用的附件地址
  const baseUri = connector.baseUri;
  const attachmentUri = `${baseUri}${baseUri.endsWith('/') ? '' : '/'}v3/attachments/${encodeURI(response.id)}/views/original`;

  return {
    name: 'image.png',
    contentType: 'image/png',
    contentUrl: attachmentUri
  };
}
注意事项
  • 确保机器人已经被添加到目标频道/聊天中,且拥有发送消息、上传文件的对应权限,用户必须先和机器人完成过一次交互,机器人才能主动向该会话发送消息。
  • Teams对上传文件有大小限制:频道会话单文件不超过4MB,个人聊天单文件不超过15MB,超出限制会返回4xx错误。
  • 如果使用Bot Builder 4.20及以上版本,可以直接调用turnContext.adapter.createConnectorClient(turnContext.activity.serviceUrl)获取连接器实例,不需要手动从turnState读取ConnectorFactory,避免Key不匹配导致拿不到客户端实例。

内容的提问来源于stack exchange,提问作者Андрей Есин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:27:19