2016-11-02 13 views
1

私はラクダを使ってs3バケットにファイルを送信しています。 md5を使ってファイルの整合性を確認したい。私はorg.apache.commons.codec.digest.DigestUtilsを使用しています。S3へのラクダ経由でmd5を使用してファイルの整合性をチェックする方法は?

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) 

私はそれをS3にアップロードするように私が正しくMD5を計算するにはどうすればよい次の例外

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) 

を取得しています。

答えて

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

私はあなたのsetHeaderにいくつかの問題点を見つけることができます。

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

まず、あなたがそれにtoString()を呼び出しているので、(私はあなたがファイルを読んでいるので、それはbyte[]を前提とします)、あなたの体のMD5を計算されません。
第2に、​​のドキュメントでは、返品タイプがbyte[]であり、再びtoString()と呼びます。バイト配列にtoString()を呼び出す

は、たとえばthis other question on SO "UTF-8 byte[] to String"を参照してください

[Bする@ 106d69cのようなものを含む文字列を返します。

あなたは文字列としてハッシュを返すDigestUtils.md5Hexを使用して、このソリューションを試してみることができます。

.setHeader(S3Constants.CONTENT_MD5, simple(DigestUtils.md5Hex(body()))) 
関連する問題