我正在使用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。
答案 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);
}
}