Logic Apps上传Blob文件至API后大小异常,PGP文件无法解密
Logic Apps上传PGP加密文件时二进制内容被转字符串导致解密失败的解决方案
问题描述
我有一个Logic App,会定期列出Blob存储内容并将文件上传至API,原本部分文件类型可正常工作,但处理PGP加密文件(如myfile.txt.pgp)时出现异常:文件上传至API后字节数组长度几乎翻倍,且无法解密。
当前使用的请求体配置如下:
{ "$content-type": "multipart/form-data", "$multipart": [ { "body": "@{body('Get_blob_content_(V2)')}", "headers": { "Content-Disposition": "form-data; name=original; filename=@{item()?['Name']}", "Content-Type": "@{item()?['MediaType']}" } }, { "body": "@{item()?['Path']}", "headers": { "Content-Disposition": "form-data; name=fullname;" } }, { "body": "@{item()?['Size']}", "headers": { "Content-Disposition": "form-data; name=blobsize;" } } ] }
实际现象:Blob内容长度为4078,上传的blobSize也显示为4078,但API接收到的文件大小约为7479,格式异常无法解密。用Postman或UI上传同一文件及参数时API可正常工作,但通过Logic Apps发送的内容格式错误。
补充:上传文本文件时发现Get blob content (V2)返回的是文件字符串内容,推测PGP文件也被当作字符串处理,导致加密内容失效,需要获取并发送原始二进制内容。
解决方案
核心是让Logic Apps以原始二进制格式传递PGP文件内容,避免字符串编码转换:
1. 修改文件内容的引用方式
将请求体中文件部分的body修改为使用binary()函数转换内容:
@{binary(body('Get_blob_content_(V2)'))}
如果Blob内容是以base64编码形式返回的,可使用组合函数:
@{binary(base64ToString(body('Get_blob_content_(V2)')))}
2. 强制设置正确的Content-Type
对于PGP文件,直接指定Content-Type为application/octet-stream,避免Logic Apps自动推断为文本类型。
修改后的完整请求体
{ "$content-type": "multipart/form-data", "$multipart": [ { "body": "@{binary(body('Get_blob_content_(V2)'))}", "headers": { "Content-Disposition": "form-data; name=original; filename=@{item()?['Name']}", "Content-Type": "application/octet-stream" } }, { "body": "@{item()?['Path']}", "headers": { "Content-Disposition": "form-data; name=fullname;" } }, { "body": "@{item()?['Size']}", "headers": { "Content-Disposition": "form-data; name=blobsize;" } } ] }
原理说明
- Logic Apps中
Get blob content (V2)默认会将非文本文件的二进制内容转为字符串形式(如转义的Unicode字符),导致字节数膨胀且破坏原始加密结构。 binary()函数可将字符串形式的二进制内容还原为原始字节流,确保API接收到的内容和原Blob完全一致。- 强制设置
application/octet-stream的Content-Type,明确告知系统这是二进制文件,避免触发文本编码转换逻辑。
内容的提问来源于stack exchange,提问作者Everett McCoy
相关产品推荐
相关产品推荐

