You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel如何设置ZIP压缩包内部存储的文件名称

Apache Camel ZIP压缩包内部文件名自定义方案

问题原因

当前配置中设置的FileName头仅被最终输出的file组件识别,用于命名外层ZIP包;zipfile序列化组件默认读取CamelFileName头作为包内文件名称,若该头不存在则自动使用Message ID作为内部文件名,因此解压后会出现MessageID.txt的默认命名。

解决方案

方案1:通过专用头指定内部文件名(轻量无侵入)

在marshal压缩步骤前设置CamelFileName头指定包内文件名,和外层ZIP命名的头分开配置即可。
修改后路由配置:

<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE-->
<!-- 设置ZIP包内部存储的文件名 -->
<setHeader name="CamelFileName">
  <simple>expected-inner-filename.txt</simple>
</setHeader>
<!-- 设置外层ZIP包文件名 -->
<setHeader name="FileName">
  <simple>myfilename</simple>
</setHeader>
<marshal>
  <zipfile/> 
</marshal>          
<to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>

方案2:zipfile标签直接配置固定内部文件名

如果内部文件名不需要动态变化,可直接在zipfile数据格式标签上配置filename属性,无需额外设置头:

<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE-->
<setHeader name="FileName">
  <simple>myfilename</simple>
</setHeader>
<marshal>
  <!-- 直接声明包内文件名 -->
  <zipfile filename="expected-inner-filename.txt"/> 
</marshal>          
<to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>

方案3:动态生成内部文件名

如果内部文件名需要根据业务规则动态生成,可先将规则生成的内部文件名存入自定义头,再在zipfile配置中引用,避免和系统头冲突:

<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE-->
<!-- 动态生成内部文件名存入自定义头 -->
<setHeader name="InnerFileName">
  <simple>order-file-${date:now:yyyyMMddHHmmss}.txt</simple>
</setHeader>
<setHeader name="FileName">
  <simple>myfilename</simple>
</setHeader>
<marshal>
  <zipfile filename="${header.InnerFileName}"/> 
</marshal>          
<to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>

注意事项

  • 不要在marshal压缩步骤之后修改CamelFileName头,否则会导致压缩包内部文件名配置失效
  • Camel 2.10.0及以上版本、3.x全版本均支持上述配置,低版本需先升级组件版本

内容的提问来源于stack exchange,提问作者Ravi Kishore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:48:31