如何使用md5通过驼峰路由到S3检查文件完整性?

时间:2016-11-02 13:20:39

标签: java amazon-s3 apache-camel md5

我正在使用camel向s3存储桶发送文件。我想使用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。

2 个答案:

答案 0 :(得分:1)

我可以在你的setHeader中发现一些问题。

.setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5(body().toString()).toString()))

首先,你不是在计算你身体的MD5(因为你正在阅读一个文件,我认为它是byte[]因为你在它上面调用toString()。)登记/> 其次,DigestUtils.md5的文档声明返回类型为byte[],您再次在其上调用toString()

在字节数组上调用toString()会返回包含类似

之类的字符串
  

[B @ 106d69c

请参阅示例this other question on SO "UTF-8 byte[] to String"

您可以使用DigestUtils.md5Hex尝试此解决方案,它将散列作为字符串返回:

.setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5Hex(body())))

答案 1 :(得分:1)

这适合我。

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);
    }
}