在名为zip-file的文件夹中使用camel解压缩文件

时间:2016-06-23 09:14:33

标签: java zip apache-camel

我想将一个zip文件解压缩到一个名为zip-file的文件夹中。例如。原始/ abc.zip应解压缩为import / abc /

我现在所做的事情是解压缩指定文件夹中的文件。

from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming()
            .convertBodyTo(String.class).to("file:" +  "</path/to/import>");

如何从“from”文件中取出文件名并将其放入“to”部分?

我是Camel的新手,所以任何帮助都会受到影响。谢谢!

3 个答案:

答案 0 :(得分:4)

此路由将zip文件的上下文从收件箱文件夹提取到发件箱文件夹,在父文件夹中,其中父名称是提取的zip文件的名称。我认为它涵盖了您的所有要求。

  fromF("file:%s?noop=true","inbox")
     .split(new ZipSplitter())
     .streaming()
     .toD("file:{{my.outbox}}/${file:onlyname.noext}/");

一些注意事项:

  1. 端点中的字符串连接看起来不太好,而且确实如此 容易出错。对于我从F使用的消费者,作为第二个 参数我给出了收件箱文件夹。您可以从常量值中获取它。目录不得包含带有$ {}占位符的动态表达式。
  2. 您不需要.convertBodyTo(String.class)
  3. 对于我用过的生产者,它从一个属性获取outbox文件夹。在这里查看详细信息https://camel.apache.org/properties.html。您可以在资源文件夹中添加属性文件(maven项目的src / main / resources)并将其加载到像这样的camel中(在java dsl routebuilder中)

    PropertiesComponent pc = new PropertiesComponent(); pc.setLocation("classpath:application.properties"); getContext().addComponent("properties“,pc)

  4. 最后,最重要的是,您必须利用文件语言并使用file:onlyname:noext。获取没有扩展名的原始zip文件名。在你的情况下abc。详情请参阅:https://camel.apache.org/file-language.html

答案 1 :(得分:0)

为了将文件路径从生产者复制到消费者,可以使用file language

这样的东西
from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming()
            .convertBodyTo(String.class).to("$simple{file:path}"));

(最初回答基于文件名的过滤)

根据文件名进行过滤: - 您可以使用filter

这样的东西
from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").fileFilter($org.apache.camel.Exchange.FILE_NAME.contains("xyz")).split(new ZipSplitter()).streaming()
            .convertBodyTo(String.class).to("file:" +  "</path/to/import>");

此外,camel允许在文件名中使用正则表达式。 所以你可以使用像

这样的东西
from("file:" + "</path/to/original>" + "regex pattern  in file name" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming()
            .convertBodyTo(String.class).to("file:" +  "</path/to/import>");

答案 2 :(得分:0)

如果查看http://camel.apache.org/file2.html,您会看到camel文件组件设置了一些标题。尝试像

这样的东西
from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming()
        .convertBodyTo(String.class).to("file:" +  "</path/to/import>" + header("CamelFileNameOnly"));