Mule 4中如何处理多部分请求中的多个文件并上传至Salesforce
问题
我需要在Mule 4应用中处理入站multipart请求,请求包含两个属性:
data:用于创建Salesforce Case记录的元数据(JSON格式)files:关联Case的文件数组
用Postman发送请求后,Mule收到的payload如下(已脱敏文件数据):
----------------------------778704367722595657997650 Content-Disposition: form-data; name="data" Content-Type: application/json [ { "subject": "test" } ] ----------------------------778704367722595657997650 Content-Disposition: form-data; name="files"; filename="logo.jpeg" Content-Type: image/jpeg jpegdata ----------------------------778704367722595657997650 Content-Disposition: form-data; name="files"; filename="icon.png" Content-Type: image/png pngdata ----------------------------778704367722595657997650--
尝试用Dataweave表达式payload.parts.files获取文件时,仅返回第一个文件logo.jpeg;用files[]形式发送文件也没形成数组。想知道:
- 是否需要遍历边界(或固定边界),有没有其他获取所有文件的方式?
- multipart是否是合适的方式,还是应该用application/json?(场景是从其他应用的联系表单发送文件到Salesforce)
解决方案
一、获取所有文件的正确方式
Mule 4处理multipart请求时,若多个part使用同一个名称(比如这里的files),直接用payload.parts.files只会返回第一个匹配的part。要获取所有同名part,需通过过滤遍历所有parts:
%dw 2.0 output application/json --- payload.parts filter ($.name == "files")
这个表达式会返回所有名称为files的part数组,之后你就可以遍历该数组逐个上传文件到Salesforce。
不需要手动处理或固定边界,Mule已经自动解析了multipart请求的结构,请求中的边界是自动生成的,无需额外干预。
二、请求格式的选择
推荐使用multipart/form-data
你的场景是从联系表单发送文件到Salesforce,multipart/form-data是最合适的格式,原因如下:
- 天然支持同时传输结构化数据(如
data字段的JSON)和二进制文件,契合表单上传的常见场景 - 二进制文件无需编码为Base64,传输效率更高,也避免了编码解码的额外开销
不推荐使用application/json
若采用application/json,需将文件转为Base64字符串嵌入JSON,会带来以下问题:
- Base64编码会使文件体积增大约30%,增加传输成本
- 处理大文件时,编码解码会消耗更多内存和CPU资源
- 不符合表单上传的常规实现方式,与其他应用对接时兼容性较差
内容的提问来源于stack exchange,提问作者Matt P
相关产品推荐
相关产品推荐

