当我将一个文件上传到S3时,我试图设置内容-md5值。我可以看到md5哈希字符串并将其传递到metadata.setContentMD5()中,但是上传文件后,我无法在web控制台中看到这个值,也无法通过java代码检索它。
我开始认为,我可能误解了内容MD5 get/set方法的目标。它们是否用于让aws服务器验证接收到的文件内容是否与我发送的内容一致?如果是这样的话,那么在上传时我应该用setContentMD5(my_md5)发送一个值,但是在以后尝试从S3下载该对象时,我是否应该将getETag()的值与计算出来的md5十六进制字符串进行比较呢?
我在试图设置这个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()有下载文件的值吗?
发布于 2016-02-16 01:26:57
我认为您是对的:getContentMD5()只是setContentMD5() 1对应的getter。它告诉您请求的被叫方认为MD5哈希是什么。如果您想知道AWS认为哈希是什么,应该使用ETag。
getContentMD5 此字段表示在调用方计算的对象内容的base64编码的128位MD5摘要。 ETag元数据字段表示由S3.计算的十六进制编码的128位MD5摘要。 返回:关联对象的内容的base64编码的MD5散列。如果未设置内容的哈希,则返回null。
最后一部分的意思大概是:除非您以前调用了setContentMD5(),否则返回null
发布于 2016-02-16 01:39:48
您不需要传递一个MD5字符串,但是如果提供它,亚马逊将使用它来验证传输,并确保它收到的信息没有损坏。
MD5只有在传输过程中才有意义,并且一旦接收到并验证传输,其生命周期就会停止。将其持久化在服务器端没有任何用处。
getter只是为了使API完整,所以您可以使用setter检查您先前做了什么。
https://stackoverflow.com/questions/35398320
复制相似问题