簡體   English   中英

如何通過駱駝路線到S3使用md5檢查文件完整性?

[英]How to check File Integrity using md5 over camel route to S3?

我正在使用駱駝將文件發送到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。

我可以在您的setHeader中發現幾個問題。

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

首先,由於要在其上調用toString() ,因此您無需計算身體的MD5(由於您正在讀取文件,因此我假設它是byte[] toString()
其次, DigestUtils.md5的文檔指出返回類型為byte[] ,您再次在其上調用toString()

在字節數組上調用toString()返回一個包含以下內容的字符串

[B @ 106d69c

例如,參見SO上的另一個問題“ UTF-8 byte [] to String”

您可以使用DigestUtils.md5Hex嘗試此解決方案,該方法將哈希作為字符串返回:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM