如何将Dynamics CRM获取的Base64附件还原为原格式文件?
解决Dynamics CRM附件Base64格式识别与保存问题
一、从Base64字符串识别文件格式
可以直接从Base64解码后的二进制数据头部判断文件格式,不同类型的文件都有固定的文件签名(Magic Number),无需完整解码整个Base64串,仅解码前4-8个字节即可匹配判断:
- JPG:头部字节为
FF D8 FF - PNG:头部字节为
89 50 4E 47 - PDF:头部字节为
25 50 44 46 - TXT:无固定签名,需通过解码后的内容判断(若为纯文本编码,解码后无不可打印字符)
具体操作逻辑:将Base64字符串解码为字节数组,提取前几个字节与已知的文件签名对比,即可确定文件格式。
二、用ADF或Logic Apps保存原格式附件
(1)Azure Logic Apps实现步骤
- 触发流程:选择手动触发,或配置Dynamics CRM触发器(当有新的
activitymimeattachments实体创建时触发) - 获取附件数据:调用Dynamics 365连接器,读取
activitymimeattachments实体的body(Base64内容)和filename字段 - 创建文件:添加「创建文件」动作(目标可选Azure Blob存储、OneDrive等)
- 「文件内容」选择动态变量中的Base64内容,Logic Apps会自动完成Base64到二进制的转换
- 「文件名」优先使用实体自带的
filename;若没有该字段,就用自定义名称+识别出的格式后缀(例如attachment_001.png)
- 运行流程,验证文件是否正常保存且格式无误
(2)Azure Data Factory(ADF)实现步骤
- 配置数据源:使用Dynamics 365连接器连接CRM,加载
activitymimeattachments实体数据,需包含body(Base64内容)和filename字段 - 处理格式识别:添加「派生列」转换,新增
file_extension列,通过表达式实现格式判断:case( left(base64ToBinary(body),3) == binary('FFD8FF'), 'jpg', left(base64ToBinary(body),4) == binary('89504E47'), 'png', left(base64ToBinary(body),4) == binary('25504446'), 'pdf', 'txt' ) - 配置接收器:选择Azure Blob存储/ADLS作为目标,设置文件名规则:
ifnull(filename, concat('attachment_', uuid(), '.', file_extension)) - 设置文件内容:将接收器的内容字段设为
base64ToBinary(body),ADF会自动将Base64转为二进制写入文件 - 运行管道,验证文件保存结果
内容的提问来源于stack exchange,提问作者Eva Patel
相关产品推荐
相关产品推荐

