Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用md5 over camel路由到S3检查文件完整性?_Java_Amazon S3_Apache Camel_Md5 - Fatal编程技术网

Java 如何使用md5 over camel路由到S3检查文件完整性?

Java 如何使用md5 over camel路由到S3检查文件完整性?,java,amazon-s3,apache-camel,md5,Java,Amazon S3,Apache Camel,Md5,我正在使用camel向s3 bucket发送一个文件。我想用md5验证文件的完整性。我使用的是org.apache.commons.codec.digest.DigestUtils from(ftp_endpoint) .idempotentConsumer(simple("${in.header.CamelFileName}"), redisIdempotentRepository) .setHeader(S3Constants.KEY, simple("${file:name

我正在使用camel向s3 bucket发送一个文件。我想用md5验证文件的完整性。我使用的是
org.apache.commons.codec.digest.DigestUtils

from(ftp_endpoint)
    .idempotentConsumer(simple("${in.header.CamelFileName}"), redisIdempotentRepository)
    .setHeader(S3Constants.KEY, simple("${file:name}"))
    .setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5(body().toString()).toString()))
    .to(s3_endpoint)
我得到以下异常

com.amazonaws.services.s3.model.AmazonS3Exception: The Content-MD5 you specified was invalid. 
(Service: Amazon S3; Status Code: 400; Error Code: InvalidDigest; Request ID: 8462458C6250091C)

如何正确计算MD5,以便将其上载到S3。

我可以在您的setHeader中发现几个问题

.setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5(body().toString()).toString()))
首先,您不是在计算身体的MD5(我假设它是
byte[]
,因为您正在读取一个文件),因为您正在对它调用
toString()

其次,docs for声明返回类型为
byte[]
,您再次对其调用
toString()

在字节数组上调用
toString()
,将返回一个包含以下内容的字符串

[B@106d69c

例如,见

您可以使用以下方法尝试此解决方案,该方法将哈希作为字符串返回:

.setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5Hex(body())))
这对我有用

from(ftp_endpoint)
    .idempotentConsumer(simple("${in.header.CamelFileName}"), redisIdempotentRepository)
    .setHeader(S3Constants.KEY, simple("${file:name}"))
    .process(md5HeadersProcessor)
    .to(s3_endpoint)


public class Md5HeadersProcessor implements Processor {
    private java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();

    @Override
    public void process(Exchange exchange) throws NoSuchAlgorithmException {
        byte[] bytes = exchange.getIn().getBody(byte[].class);
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(bytes);
        String md5= encoder.encodeToString(md.digest());
        exchange.getIn().setHeader(S3Constants.CONTENT_MD5, md5);
    }
}