当前位置: 首页 > 知识库问答 >
问题:

使用camel对文件进行压缩和密码保护

伍宝
2023-03-14

现在新的要求是密码保护他们。下面是我使用的聚合策略。如何实现这一点?

<route autoStartup="false" routePolicyRef="routeTwoTimer" startupOrder="2" id="zippingFileRoute">
    <from uri="{{to.file.processed1}}"/>
    <choice id="csvZipFile">
        <when>
            <simple>$simple{header.CamelFileName} regex '^.*(csv|CSV)$'</simple>
            <aggregate strategyRef="zipAggregationStrategy" completionFromBatchConsumer="true" eagerCheckCompletion="true">
                <correlationExpression>
                    <constant>true</constant>
                </correlationExpression>
                <to uri="{{to.file.processed2}}"/>
            </aggregate>
        </when>
    </choice>
</route>

共有1个答案

柯琛
2023-03-14

正如注释中所指出的,Java API在加密ZIP文件方面有点有限。Apache CamelZipAggregationStrategy使用的是ZipOutputStream,所以也有这个限制。您可以使用任何其他库实现自定义聚合器,它允许对Zip文件进行加密。例如Zip4j

添加Maven依赖项

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
</dependency>

实现自定义聚合器

import net.lingala.zip4j.core.ZipFile;
//next few imports. I have added this only to take correct ZipFile class, not the JDK one 

public class PasswordZipAggregationStrategy implements AggregationStrategy {

public static final String ZIP_PASSWORD_HEADER = "PasswordZipAggregationStrategy.ZipPassword";

@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange){
    try {
        if (newExchange == null) {
            return oldExchange;
        }
        return aggregateUnchecked(oldExchange,newExchange);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private Exchange aggregateUnchecked(Exchange oldExchange, Exchange newExchange) throws Exception{
    ZipFile zipFile;
    String password;
    if (oldExchange == null) { // first
        password = newExchange.getIn().getHeader(ZIP_PASSWORD_HEADER, String.class);
        zipFile = new ZipFile(newExchange.getExchangeId()+".zip");
        File toDelete = new File(zipFile.getFile().getPath());
        newExchange.addOnCompletion(new Synchronization() {
            @Override
            public void onComplete(Exchange exchange) {
                toDelete.delete();
            }

            @Override
            public void onFailure(Exchange exchange) {
            }
        });
    } else {
        password = newExchange.getIn().getHeader(ZIP_PASSWORD_HEADER, String.class);
        zipFile = new ZipFile(oldExchange.getIn().getBody(File.class));
    }

    if (password==null){
        throw new IllegalStateException("Null password given");
    }

    ZipParameters zipParameters = new ZipParameters();
    zipParameters.setPassword(password);
    zipParameters.setEncryptFiles(true);
    zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FAST);
    zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
    zipFile.addFile(newExchange.getIn().getBody(File.class), zipParameters);
    GenericFile genericFile = FileConsumer.asGenericFile(zipFile.getFile().getParent(), zipFile.getFile(), Charset.defaultCharset().toString(), false);
    genericFile.bindToExchange(newExchange);

    newExchange.getIn().setBody(zipFile.getFile());
    newExchange.getIn().setHeader(ZIP_PASSWORD_HEADER, password);
    return newExchange;
}
}
from("file://in")
    .to("log:in")
    .setHeader(PasswordZipAggregationStrategy.ZIP_PASSWORD_HEADER, constant("testPassword"))
    .aggregate().constant(true).completionFromBatchConsumer()
        .aggregationStrategy(new PasswordZipAggregationStrategy())
.to("log:out")
.to("file://out");
 类似资料:
  • 问题内容: 我有一个密码保护Excel文件的问题。 情况是,我有一个zip文件,其中有一个Excel文件。我需要编写一个Java程序,以密码保护Excel文件。因此,用户应该能够解压缩文件(压缩文件无需密码保护)。但是,Excel需要使用密码保护。当用户尝试解压缩文件时,他应该能够解压缩。当他尝试打开Excel文件(位于解压缩的文件夹内)时,它必须要求输入密码。问题类似于使用Java保护excel

  • 除非设置了主密码,否则压缩配置文件里保存的密码没有安全地加密,并且可以被任何能访问 您电脑的人读取。您可以输入主密码来加密保存在注册表里的密码数据,并保护它免遭未经授权 的访问。此后,您需要在密码提示对话框里输入主密码,才能访问此压缩配置文件。 您可以使用与密码管理器里相同的作为主密码,或者选择不同的密码。您甚至可以为不同的 压缩配置文件指定不同的主密码,尽管这样可能不便于使用。 一旦输入,主密码

  • 问题内容: 尝试使用Apache Camel解压缩文件时,我尝试了http://camel.apache.org/zip-file- dataformat.html中 给出的示例,但找不到 UnZippedMessageProcessor 类。这是代码: 是否有人尝试这样做或通过骆驼路线将文件解压缩? 先感谢您! 问题答案: 您也可以像这样定义路由,可以在camel-zipfile中找到 ZipS

  • 本文向大家介绍C#文件流进行压缩和解压缩的方法,包括了C#文件流进行压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#文件流进行压缩和解压缩的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我是Go的新手,无法弄清楚如何使用该软件包对我有利。基本上,我只想写一些东西到文件中,将其gzip压缩,然后通过另一个脚本直接从压缩格式读取。如果有人可以给我一个有关如何执行此操作的示例,我将不胜感激。 问题答案: 所有压缩包都实现相同的接口。您将使用以下方式进行压缩: 并解压缩:

  • 问题内容: 我想使用Java代码将文件压缩为zip,rar和7z格式。我也想在指定位置解压缩这些文件。谁能告诉我如何在Java中使用7-zip压缩和解压缩文件? 问题答案: 我用过:sevenzipjbinding.jar sevenzipjbinding-Allplatforms.jar 我现在可以使用这些jar解压缩文件。 尝试使用此链接进行解压缩:http : //sourceforge.n