上传文件到S3时如何设置内容md5?

2024-02-12

当我将文件上传到 S3 时,我尝试设置 content-MD5 值。我可以看到 md5 哈希字符串并将其传递到metadata.setContentMD5()但是文件上传后,我在Web控制台中看不到这个值,也无法通过java代码检索它。

我开始认为我可能误解了内容 MD5 获取/设置方法的目标。它们是否用于让 aws 服务器验证接收到的文件内容与我发送的内容是否一致?如果是这样的话我应该发送一个值setContentMD5(my_md5)上传时,但我应该比较的值getETag()当我稍后尝试从 S3 下载该对象时,使用我计算出的 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() 具有下载文件的值?


我认为你是对的:getContentMD5()只是对应的 gettersetContentMD5() 1 http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectMetadata.html#setContentMD5(java.lang.String)。它告诉您请求的被调用方认为 MD5 哈希值是什么。如果您想知道 AWS 认为哈希值是什么,您应该使用 ETag。

获取内容MD5

该字段表示在调用方计算的对象内容的 Base64 编码 128 位 MD5 摘要。ETag 元数据字段表示由 Amazon S3 计算的十六进制编码的 128 位 MD5 摘要。

返回: 关联对象内容的 Base64 编码 MD5 哈希值。如果尚未设置内容的 MD5 哈希值,则返回 null。

最后一部分大概意味着:返回 null 除非您之前调用过setContentMD5()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上传文件到S3时如何设置内容md5? 的相关文章

随机推荐