gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:53:31 26 4
gpt4 key购买 nike

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

我开始认为我可能误解了内容 MD5 get/set 方法的目标。它们是用来让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() 有下载文件的值?

最佳答案

我认为您是正确的:getContentMD5() 只是setContentMD5() 的相应getter 1 .它告诉您请求的被调用方认为 MD5 散列是什么。如果您想知道 AWS 认为散列是什么,您应该使用 ETag。

getContentMD5

This field represents the base64 encoded 128-bit MD5 digest digest of an object's content as calculated on the caller's side. The ETag metadata field represents the hex encoded 128-bit MD5 digest as computed by Amazon S3.

Returns: The base64 encoded MD5 hash of the content for the associated object. Returns null if the MD5 hash of the content hasn't been set.

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

关于java - 上传文件到S3时如何设置内容md5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com