Multipart请求转JSON入SQS遇问题,是否用Base64编码保存数据?
问题与解决方案
问题描述
收到如下格式的multipart请求:
----------------------------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--
需要将该负载发送至SQS队列,适配AWS连接器的示例转换代码如下:
%dw 2.0 output application/java --- { delaySeconds: 120, body: write(payload, 'application/json'), messageAttributes: { "objectType": { "stringValue": "cases", "dataType": "String" } as Object { class: "org.mule.extension.sqs.api.model.MessageAttributeValue" } } as Object { class: "java.util.HashMap" } } as Object { class: "org.mule.extension.sqs.api.model.Message" }
但直接将multipart转换为JSON会损坏二进制数据(比如image/jpeg转JSON后无法正确反序列化)。需求是提取请求中的每个文件,在下游应用重建multipart请求,疑问是:将multipart数据Base64编码,重建时解码以保留原始数据是否为正确解决方案?
解决方案
是,Base64编码是可行且常用的解决方案,具体实现逻辑如下:
上游编码处理
- 在Mule中解析multipart请求,分离出
dataJSON部分和每个files文件部分 - 对每个文件的二进制内容执行Base64编码,同时保留文件的核心元数据:文件名、Content-Type、表单字段名(
files) - 将
data的原始JSON内容和所有文件的「元数据+Base64编码内容」组合成一个结构化JSON对象,作为SQS的消息体
核心DW处理示例:
%dw 2.0 output application/json --- { data: payload.data, files: payload.files map ((file) -> { filename: file.attribute('filename'), contentType: file.attribute('Content-Type'), fieldName: file.attribute('name'), content: toBase64(file.content) }) }- 在Mule中解析multipart请求,分离出
下游重建请求
- 从SQS接收消息后,解析JSON结构还原
data和文件列表 - 对每个文件的Base64编码内容进行解码,恢复原始二进制数据
- 根据保存的元数据(文件名、Content-Type、字段名),重新构建multipart/form-data的对应部分
- 组合
data部分和重建的文件部分,生成与原始请求一致的multipart请求
- 从SQS接收消息后,解析JSON结构还原
这种方式既满足了SQS对消息体为文本/JSON格式的要求,又能完整保留原始文件的二进制信息,确保下游系统可以准确重建请求。
内容的提问来源于stack exchange,提问作者Matt P
相关产品推荐
相关产品推荐

