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

使用Twilio WhatsApp API发送多类型文件时格式不匹配问题排查

解决Twilio WhatsApp集成发送视频/文档时的格式不匹配问题

问题分析

从错误日志msg=header: Format mismatch, expected IMAGE, received VIDEO可以看出,Twilio预期接收的是图片类型媒体,但实际收到的是其他类型(哪怕是PDF也触发这个错误),核心原因集中在两点:

  • WhatsApp模板中对应的变量类型定义错误
  • 代理服务器返回的响应头不完整,导致Twilio无法正确识别文件类型

解决方案

1. 修正WhatsApp模板的变量类型

你创建的模板中,{{6}}这个变量如果被定义为IMAGE类型,无论代理返回什么文件,Twilio都会强制校验为图片,从而触发格式不匹配错误。需要:

  • 登录Twilio控制台找到对应WhatsApp模板
  • 将{{6}}的变量类型修改为对应媒体类型:
    • 发送文档时设为DOCUMENT
    • 发送视频时设为VIDEO
    • 注意:单个模板的变量类型固定,若需发送多种类型文件,需创建对应类型的多个模板

2. 完善代理服务器的响应头处理

当前代理代码仅处理了部分文件类型的Content-Type,且缺少Content-Disposition头,这可能导致Twilio无法正确识别文件类型。修改后的代码如下:

app.get('/proxy-file', async (request, reply) => {
    const { file: fileUrl } = request.query;

    if (!fileUrl) {
        reply.status(400).send('File URL is required');
        return;
    }

    try {
        const response = await axios.get(fileUrl, {
            responseType: 'arraybuffer',
        });

        let contentType = 'application/octet-stream';
        let fileName = 'file';
        
        // 根据文件后缀设置正确的Content-Type和文件名
        if (fileUrl.endsWith('.pdf')) {
            contentType = 'application/pdf';
            fileName = 'document.pdf';
        } else if (fileUrl.endsWith('.doc')) {
            contentType = 'application/msword';
            fileName = 'document.doc';
        } else if (fileUrl.endsWith('.docx')) {
            contentType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
            fileName = 'document.docx';
        } else if (fileUrl.endsWith('.mp4')) {
            contentType = 'video/mp4';
            fileName = 'video.mp4';
        } else if (fileUrl.match(/\.(jpg|jpeg|png|gif)$/i)) {
            // 补全图片类型的Content-Type
            const ext = fileUrl.split('.').pop().toLowerCase();
            contentType = ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : `image/${ext}`;
            fileName = `image.${ext}`;
        }

        // 添加Content-Disposition头,帮助Twilio识别文件类型和名称
        reply.header('Content-Type', contentType);
        reply.header('Content-Disposition', `attachment; filename="${fileName}"`);
        reply.send(response.data);
    } catch (error) {
        reply.status(500).send('Erro ao obter o arquivo');
    }
});

3. 验证文件内容完整性

确保代理请求的源文件URL可访问,且axios获取的response.data是完整的二进制数据。可通过直接访问代理URL,检查浏览器能否正确下载并打开文件,验证内容是否正常。

额外注意事项

  • WhatsApp对文件大小有限制:文档最大100MB,视频最大16MB,需确保文件符合要求
  • 代理服务器需公网可访问,且无防火墙或IP限制导致Twilio无法请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:28:26