使用CommonsMultipartResolver解析具有嵌入式多部分内容

时间:2015-10-14 18:14:24

标签: spring spring-integration

我正在使用Spring Integration来接收HTTP请求,该请求具有嵌套在多部分请求中的多部分内容,如下所示。当使用 CommonsMultipartResolver 作为解析器时,传递给接收服务激活器的 LinkedMultiValueMap 包含所有部分的映射,但嵌入的multipart是 UploadedMultipartFile 包含整个内容。在示例中 boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL 是嵌入式多部分的边界。

如何将嵌入的multipart解析为 LinkedMultiValueMap ,以便获取版本和有效负载? CommonsMultipartResolver 是否可以执行此操作,还是有其他方法可以解析它?

Http请求:

  

POST http://xxxxx:8087/edi846Inbound HTTP / 1.1

     

Content-Type:multipart / form-data; boundary = DM1-Sb0636VXPQNO3412Ygegb9suqr   .......

     

内容长度:2787

     

- DM1-Sb0636VXPQNO3412Ygegb9suqr

     

内容 - 处置:表单数据;命名="从"

     

Content-Type:text / plain; charset = ISO-8859-1 Content-Length:7

     

gisb应答收据

     

- DM1-Sb0636VXPQNO3412Ygegb9suqr

     

内容 - 处置:表单数据;命名="输入格式"内容类型:   text / plain; charset = ISO-8859-1 Content-Length:3

     

X12

     

- DM1-Sb0636VXPQNO3412Ygegb9suqr

     

内容 - 处置:表单数据;名称="输入数据&#34 ;;文件名=" TEST-DTEBS_846_3563_10142015102600.x12"

     

内容类型:   multipart / encrypted; boundary = boundary2 - extKDvsqGExTQI2WVuplHFCUQJ3XVL协议:   应用/ PGP加密

     

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL

     

内容 - 处置:表单数据;命名="版本"内容类型:   application / pgp-encrypted Content-Length:10

     

版本:1

     

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL

     

内容 - 处置:表单数据;命名="有效载荷" Content-Type:application / octet-stream Content-Length:   1118

     

----- BEGIN PGP MESSAGE -----版本:BCPG v1.47

     

hQIOA8aa0 / bci2e / EAF / fkgOBK + cOoeY + 44htcvjE9Sxk9RK73aOEaxDOBNqFOsV   Nzw1va7cc7wzYOTlHhZV / MkpXq + IrZV316moJu1EAhscN9YmyReVDOzrkzZ1hBmq   V2MlAr5 / CRqS7nQEmCqy / Mz0STtAPZNg3FOh8F79dJnRws5 / SDW + zvn2MoSvGTs3   0YvjmtPq2YyVkMlAvJ62f903UYNIiAcEe1k8gWDVW9LJ4tGud + 8H0bsG8EFWPsSI   b5rON + MKGykbWGnbSrOy9cqslJaghj91r7ZbsXXXiRn9v4rpOardfiBEnoamI5Tz   jfDKESnr7CqoZgb62je + NJrB5puoAwy8LTynXx4cmQgAnf8lb6f + mIxa1U1Mu6iR   KNTjrH83Cx2BjTra8E8hu0O7GvuczGfA9NiONmxbglgKK58 / QVYdlsZUiGTaWkkY   4nMHiaFe9TiPQ6W2vMGutLFR3V6YSshchCskl6cP1OdaIXCYgzZKIjUWHePzd / DS   zCZeNqul1N7iIQ0L5lfSGgfB2eDeeK3JKFjetrrbJQXz0 + XeTZLPMSMr6W5Ggq3l   PnoJVTrxUd3b2WKgR4FZB + imYRWEz5KLnB5ZVedC + fU24bECcNptrTQaZZUWnR3Z   ABJqz8avBrNV0Jf9BaFRxcWkrWyr4KtxDArxXOuMHNvGVtj + hhPZcPGj3N9Xam3E   6snAGebIiAEivZPYLVVVk0lZW2H0ISwkKkjD8qs7h8wa7Qbchp2K5IyENEzi20oe   FNRoCwHyjsCY0nECHCG3WON0EXG2DZDTvA17OoyfuKnRT09FVt3OOEPTV048vUid   kUoGa7uT7ud9En7uNSfmDpw + xHxB38N986BKBtoeJlGgDYISJkIgr40TIKMLE / YC   whDnmKxT68dfSGcv / DIUzYs + d / OBzSpHIWK87me5QnhmLTQ1xwfwtFoTyk6B3Vzx   ljlZFD6e7PJfjo / RIhb0zMvtBvRTONRrMXKRdRY =   = SERM   -----结束PGP消息-----

     

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL -

     

- DM1-Sb0636VXPQNO3412Ygegb9suqr -

来自地图的嵌入式内容:

  

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL

     

内容 - 处置:表单数据;命名="版本"内容类型:application / pgp-encrypted Content-Length:   10

     

版本:1

     

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL

     

内容 - 处置:表单数据;命名="有效载荷" Content-Type:application / octet-stream Content-Length:   1118

     

----- BEGIN PGP MESSAGE -----版本:BCPG v1.47

     

hQIOA8aa0 / bci2e / EAF / fkgOBK + cOoeY + 44htcvjE9Sxk9RK73aOEaxDOBNqFOsV   Nzw1va7cc7wzYOTlHhZV / MkpXq + IrZV316moJu1EAhscN9YmyReVDOzrkzZ1hBmq   V2MlAr5 / CRqS7nQEmCqy / Mz0STtAPZNg3FOh8F79dJnRws5 / SDW + zvn2MoSvGTs3   0YvjmtPq2YyVkMlAvJ62f903UYNIiAcEe1k8gWDVW9LJ4tGud + 8H0bsG8EFWPsSI   b5rON + MKGykbWGnbSrOy9cqslJaghj91r7ZbsXXXiRn9v4rpOardfiBEnoamI5Tz   jfDKESnr7CqoZgb62je + NJrB5puoAwy8LTynXx4cmQgAnf8lb6f + mIxa1U1Mu6iR   KNTjrH83Cx2BjTra8E8hu0O7GvuczGfA9NiONmxbglgKK58 / QVYdlsZUiGTaWkkY   4nMHiaFe9TiPQ6W2vMGutLFR3V6YSshchCskl6cP1OdaIXCYgzZKIjUWHePzd / DS   zCZeNqul1N7iIQ0L5lfSGgfB2eDeeK3JKFjetrrbJQXz0 + XeTZLPMSMr6W5Ggq3l   PnoJVTrxUd3b2WKgR4FZB + imYRWEz5KLnB5ZVedC + fU24bECcNptrTQaZZUWnR3Z   ABJqz8avBrNV0Jf9BaFRxcWkrWyr4KtxDArxXOuMHNvGVtj + hhPZcPGj3N9Xam3E   6snAGebIiAEivZPYLVVVk0lZW2H0ISwkKkjD8qs7h8wa7Qbchp2K5IyENEzi20oe   FNRoCwHyjsCY0nECHCG3WON0EXG2DZDTvA17OoyfuKnRT09FVt3OOEPTV048vUid   kUoGa7uT7ud9En7uNSfmDpw + xHxB38N986BKBtoeJlGgDYISJkIgr40TIKMLE / YC   whDnmKxT68dfSGcv / DIUzYs + d / OBzSpHIWK87me5QnhmLTQ1xwfwtFoTyk6B3Vzx   ljlZFD6e7PJfjo / RIhb0zMvtBvRTONRrMXKRdRY =   = SERM

     

-----结束PGP消息-----

     

boundary2 ---- extKDvsqGExTQI2WVuplHFCUQJ3XVL -

2 个答案:

答案 0 :(得分:0)

不确定您的意思,但我建议您调查MultipartAwareFormHttpMessageConverter.readMultipart()中的代码。这是UploadedMultipartFile出现的地方。

答案 1 :(得分:0)

快速查看CommonsMultipartResolver似乎表明它不支持嵌套的多部分。

将其子类化并覆盖parseRequest()可能并不太难,但您可能也需要深入研究commons-fileupload

修改

关于多部分回复:

我只是patched the http sample并且发现,只要请求具有正确的accept标头,只需返回MultiValueMap“就行了”。

如果您需要更多地控制部件标头,则需要对AllEncompassingFormHttpMessageConverter进行子类化并覆盖getHttpEntity()以插入额外的标头并配置网关以使用自定义适配器。但是基本标题工作正常 - 这......

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("foo", "Hello");
map.add("bar", "baz");
map.add("fiz", "qux".getBytes());
return map;

......导致这个......

--6_zk8PXoaiUO_By2XJuUpjs5CEEnYM-wj0qE
Content-Disposition: form-data; name="foo"
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 5

Hello
--6_zk8PXoaiUO_By2XJuUpjs5CEEnYM-wj0qE
Content-Disposition: form-data; name="bar"
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 3

baz
--6_zk8PXoaiUO_By2XJuUpjs5CEEnYM-wj0qE
Content-Disposition: form-data; name="fiz"
Content-Type: application/octet-stream
Content-Length: 3

qux
--6_zk8PXoaiUO_By2XJuUpjs5CEEnYM-wj0qE--