在Twilio Studio Flow中如何控制入站消息媒体的文件扩展名及大小限制
Twilio入站消息媒体限制需求实现解答
该需求完全可以通过Twilio Functions实现,具体实现方案如下:
接入流程
- 在Twilio Studio Flow的入站消息触发节点后,添加「Run Function」节点,将入站消息的全量参数透传给自定义的Twilio Function
- Function完成校验后返回校验结果到Studio Flow,你可根据返回的成功/失败标记配置后续流程:校验通过进入后续业务逻辑,校验失败则自动回复提示用户发送符合要求的文件
核心校验逻辑
Twilio入站MMS消息会自动携带以下相关参数:
NumMedia:本次消息携带的媒体文件总数MediaContentType{N}:下标为N的媒体文件的MIME类型,N从0开始计数MediaUrl{N}:下标为N的媒体文件的存储地址
你只需在Function内按如下规则校验即可:
- 遍历所有媒体文件的MIME类型,仅放行
image/jpeg、image/png两种类型 - 对符合格式要求的文件,发起HEAD请求获取对应
MediaUrl的Content-Length响应头,换算为MB后超过7MB则判定为不合法
参考代码示例
exports.handler = function(context, event, callback) { const MAX_FILE_SIZE_MB = 7; const ALLOWED_MIME_TYPES = ['image/jpeg', 'image/png']; const https = require('https'); // 无媒体文件场景,可根据自身业务调整是否允许 if (parseInt(event.NumMedia || 0) === 0) { return callback(null, { is_valid: true, message: '无媒体文件' }); } let isValid = true; let errorMsg = ''; let completedCheckCount = 0; const totalMedia = parseInt(event.NumMedia); for (let i = 0; i < totalMedia; i++) { const currentType = event[`MediaContentType${i}`]; const currentUrl = event[`MediaUrl${i}`]; // 格式校验 if (!ALLOWED_MIME_TYPES.includes(currentType)) { isValid = false; errorMsg = '仅支持jpeg、png格式的图片'; break; } // 大小校验 https.request(currentUrl, { method: 'HEAD' }, (res) => { const fileSizeMb = parseInt(res.headers['content-length'] || 0) / (1024 * 1024); if (fileSizeMb > MAX_FILE_SIZE_MB) { isValid = false; errorMsg = '单张图片大小不能超过7MB'; } completedCheckCount++; if (completedCheckCount === totalMedia) { return callback(null, { is_valid: isValid, message: errorMsg }); } }).end(); } };
注意事项
- 建议提前将Twilio Functions的超时时间调整到10秒以上,避免大文件HEAD请求超时导致校验失败
- 如果需要处理多文件场景,可自行调整逻辑累加所有文件大小或者逐一校验单文件大小即可
内容的提问来源于stack exchange,提问作者anupamb
相关产品推荐
相关产品推荐

