Как мне установить контент md5 при загрузке файла на S3?

Я пытаюсь установить значение content-MD5 при загрузке файла на S3. Я вижу строку хеша md5 и передаю ее вmetadata.setContentMD5() но после загрузки файла я не вижу это значение в веб-консоли и не могу получить его с помощью кода Java.

Я пришел к выводу, что, скорее всего, я неправильно понимаю цель методов получения / установки контента MD5. Используются ли они, чтобы позволить серверу aws проверять, соответствует ли содержимое полученного файла тому, что я отправляю? Если это так, то я должен отправить значение сsetContentMD5(my_md5) при загрузке, но я должен тогда просто сравнить значениеgetETag() с моей вычисленной шестнадцатеричной строкой md5, когда я позже попытаюсь загрузить этот объект из S3?

Я делаю что-то не так, пытаясь установить это значение md5?

String access_key = "myaccesskey";
String secret_key = "mysecretkey";
String bucket_name = "mybucketname";
String destination_key = "md5_test.txt";
String file_path = "C:\\my-text-file.txt";

BasicAWSCredentials creds = new BasicAWSCredentials(access_key, secret_key);
AmazonS3Client client = new AmazonS3Client(creds);
client.setRegion(RegionUtils.getRegion("us-east-1"));

File file = new File(file_path);

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("text/plain");
metadata.setContentLength(file.length());

FileInputStream fis = new FileInputStream(file);
byte[] content_bytes = IOUtils.toByteArray(fis);
String md5 = new String(Base64.encodeBase64(DigestUtils.md5(content_bytes)));
metadata.setContentMD5(md5);

PutObjectRequest req = new PutObjectRequest(bucket_name, destination_key, file).withMetadata(metadata);
PutObjectResult result = client.putObject(req);

GetObjectMetadataRequest mreq = new GetObjectMetadataRequest(bucket_name, destination_key);
ObjectMetadata retrieved_metadata = client.getObjectMetadata(mreq);

// I think I expected getContentMD5 below to show the string I passed in
// during the upload, but the below prints "md5:null"
System.out.println("md5:" + retrieved_metadata.getContentMD5());

Я неправильно вычисляю строку MD5? Если я передаю случайную строку, я получаю сообщение об ошибке, так что кажется, что S3 доволен тем, что я посылаю через приведенный выше код. И если строка MD5 верна, почему я не могу получить ее позже при использованииclient.getContentMD5() метод? Я понимаю, что ETag должен быть шестнадцатеричной строкой MD5, и я также могу рассчитать ее для моего загруженного файла (и получить ту же строку, что вычисляет S3), поэтому я не должен ожидать, что getContentMD5 () когда-либо получит значение для загруженного файла?

Ответы на вопрос(2)

Ваш ответ на вопрос