【问题标题】:Java AWS S3: Why S3Object.ObjectMetadata.ContentMD5 is null while S3Object.ObjectMetadata.Etag is not nullJava AWS S3:为什么 S3Object.ObjectMetadata.ContentMD5 为空,而 S3Object.ObjectMetadata.Etag 不为空
【发布时间】:2016-01-23 02:11:24
【问题描述】:

S3Object 的 ContentMD5 为空。根据文档,如果未设置,则为 null。所以问题是我如何设置它。

我正在使用预签名的 url 将数据上传到 S3 存储桶,当我获取对象时,MD5Content 为空。但是,E3Object 不为空,并且保存已上传文件的正确 Hex 编码的 128 位 Md5 值。预签名的 url 也设置了标头“content-md5”,值是 Base64 编码的 MD5。

创建预签名网址的代码是:

GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key, httpMethod);
generatePresignedUrlRequest.setContentType("image/jpeg");
byte[] resultByte = DigestUtils.md5(getImage());
String streamMD5 = new String(java.util.Base64.getEncoder().encode(resultByte));
 generatePresignedUrlRequest.setContentMd5(streamMD5);

获取数据的代码:

S3Object s3Object = getClient().getObject(new GetObjectRequest(bucket, key));
s3Object.getObjectMetadata().getETag(); //not null
s3Object.getObjectMetadata().getContentMD5(); // null

【问题讨论】:

    标签: java amazon-web-services amazon-s3 md5


    【解决方案1】:

    亚马逊在上传数据时使用 Base 64 MD5,而在下载时使用 Hex MD5,它是 s3Object.getObjectMetadata().getETag() 的一部分

    【讨论】:

      【解决方案2】:

      预签名 URL 是 .. 预签名 URL,供以后使用。在预签名 URL 上设置 md5 会执行以下操作,per documentation

      设置请求的预期 content-md5 标头。计算签名时会包含此标头值,以后的请求必须包含相同的 content-md5 标头值才能访问预签名 URL。

      为了更改现有 s3 对象的元数据,必须复制它。你可以这样做:

      ObjectMetadata metadata = new ObjectMetadata().setContentMD5(streamMD5);
      CopyObjectRequest cor = new CopyObjectRequest(bucket, key, bucket, key);
      getClient().copyObject(cor);
      

      最后,当你这样做时:

      generatePresignedUrlRequest.setContentMd5(streamMD5);
      

      您所做的只是准备一个请求。然后您需要提出请求:

      PresignedUrl presignedUrl = getClient().generatePresignedUrl(generatePresignedUrlRequest)
      

      【讨论】:

      • 感谢您的回复。正在发出使用预签名 url 的请求,它工作正常,但后来当我尝试获取对象时,3Object.getObjectMetadata().getContentMD5() 为空。所以问题是,当使用 md5 内容设置 presinged url 并且使用带有 md5 标头的 presigned url 上传对象时,为什么获取对象会导致 null 竞争 m5。
      • @suchit 这是因为您在上传 s3 对象时没有设置 MD5。注意 etag 与 md5 不同。
      • 以下是使用预签名url将数据上传到S3的代码。现在正在使用代码如果上传成功不应该在获取对象时,md5 不应该为空 HttpURLConnection connection = (HttpURLConnection) url.openConnection();连接.setDoOutput(true);连接.setDoInput(true); connection.setRequestMethod("PUT"); connection.setRequestProperty("Content-Type","image/jpeg"); connection.setRequestProperty("content-md5", getMd5());输出流输出 = 连接.getOutputStream(); output.write(getImage()); output.flush();
      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2011-05-03
      • 2013-10-14
      • 2019-11-10
      • 1970-01-01
      相关资源
      最近更新 更多