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

BotFramework(Teams环境)含特殊字符附件上传丢失问题求助

问题分析与解决:BotFramework接收Teams含特殊字符附件丢失数据

问题概述

使用C#(.NET 8)开发BotFramework时,从Microsoft Teams上传名称含特殊字符(如+)的附件,后端无法正常接收完整信息:普通文件名(如test.txt)能收到完整附件数据,但文件名带+(如test+.txt)时,后端仅收到空内容的text/html类型附件,原文件信息丢失,且该问题在官方的附件处理基础示例中可复现。

核心原因

这是BotFramework处理Teams附件时的URL编码解析问题:Teams上传附件时,会对文件名中的特殊字符进行URL编码(比如+会被编码为%2B),但BotFramework默认的解析逻辑在处理这类编码后的文件名时,会错误地将%2B还原为空格而非原有的+,导致后续文件匹配或读取逻辑失效,最终返回错误的空附件数据。

解决方法

方法1:手动解码附件URL中的文件名

在处理附件时,手动从ContentUrl中提取并正确解码文件名,替代直接使用Attachment.Name属性:

if (turnContext.Activity.Attachments != null && turnContext.Activity.Attachments.Any())
{
    foreach (var file in turnContext.Activity.Attachments)
    {
        // 从ContentUrl中提取并解码文件名
        var uri = new Uri(file.ContentUrl);
        var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);
        var encodedFileName = queryParams.Get("fileName");
        var decodedFileName = System.Web.HttpUtility.UrlDecode(encodedFileName);

        // 正确获取文件类型和URL
        var fileType = file.ContentType;
        var fileUrl = file.ContentUrl;

        Console.WriteLine($"Received file: {decodedFileName} ({fileType}) at {fileUrl}");
    }
}

注意:如果项目是.NET Core/.NET 8,需要引用System.Web NuGet包(System.Web.HttpUtility属于该包)。

方法2:自定义附件解析中间件

创建自定义中间件,在Activity到达业务逻辑前,修正附件的Name属性和ContentUrl的编码问题:

public class FixAttachmentEncodingMiddleware : IMiddleware
{
    public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
    {
        if (turnContext.Activity.Attachments != null)
        {
            foreach (var attachment in turnContext.Activity.Attachments)
            {
                if (!string.IsNullOrEmpty(attachment.ContentUrl))
                {
                    var uri = new Uri(attachment.ContentUrl);
                    var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);
                    var encodedFileName = queryParams.Get("fileName");
                    if (!string.IsNullOrEmpty(encodedFileName))
                    {
                        attachment.Name = System.Web.HttpUtility.UrlDecode(encodedFileName);
                    }
                }
            }
        }

        await next(cancellationToken);
    }
}

然后在Program.cs中注册中间件:

services.AddBot<YourBot>(options =>
{
    // 其他配置...
    options.Middleware.Add(new FixAttachmentEncodingMiddleware());
});

验证

使用上述方法后,上传test+.txt这类带特殊字符的文件,后端能正确获取文件名和完整附件数据,解决原问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:12:09