2016-11-02 2 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를 계산하지 않습니다.
두 번째로 DigestUtils.md5의 docs는 반환 유형이 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())))