当前位置: 首页 > 知识库问答 >
问题:

读取的数据与预期的长度不同:DataLength=964481363;预期长度=964481376;

南宫正阳
2023-03-14

我正在尝试从S3读取一个加密对象,然后用不同的加密密钥将其上传到S3中的一个新bucket中。而我正在尝试使用getObject()读取对象,并尝试使用PutObject请求放置对象。

当我打印源代码的内容长度时,它是964481376。那么,数据长度从何而来?是964481363

内容类型

二进制/二进制八位数流

x-amz-元-x-amz-未加密-内容-长度

我不能共享KMS密钥。

public boolean copyS3Object(AmazonS3Encryption sourceS3Client, AmazonS3URI sourceS3Uri,
            AmazonS3Encryption destS3Client, AmazonS3URI destS3Uri) throws AmazonServiceException, IOException {
        //String eTag;
        S3Object sourceS3Object = null;

        try {
            //Get the Source object stream
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            ObjectMetadata objectMetadata = sourceS3Object.getObjectMetadata();
            System.out.println("content length " + objectMetadata.getContentLength());
            PutObjectRequest putRequest = new PutObjectRequest(destS3Uri.getBucket(), destS3Uri.getKey(),
                    sourceS3Object.getObjectContent(), sourceS3Object.getObjectMetadata());

            destS3Client.putObject(putRequest);
//
//            if (eTag.isEmpty()) {
//                System.out.println("Copy failed, New object in " + destS3Uri.toString() + " is empty");
//                return false;
//            }

        } catch (AmazonServiceException e) {
            throw e;
        } finally {
            if (sourceS3Object != null) {
                sourceS3Object.close();
            }
        }
        //System.out.println("Copied successfully to " + destS3Uri.toString() + " Etag:" + eTag);
        return true;
    }

但我得到以下错误:

共有1个答案

容飞掣
2023-03-14

我想出了问题所在。S3对象的内容长度是加密后的数据长度。但当我放置对象时,我正在尝试放置未加密的数据。所以我需要显式地将对象的内容长度设置为未加密长度。下面的代码解决了这个问题。

 try {
            //Get the Source object stream
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            //For a decrypted object, the content length in metadata has the encrypted length
            //Set the content length to the unencrypted-data-length
            ObjectMetadata objectMetadata = sourceS3Object.getObjectMetadata();
            Map<String, String> modelMetaData = objectMetadata.getUserMetadata();
            Long unencryptedDataLength = Long.parseLong(modelMetaData.get(
                    "x-amz-unencrypted-content-length"));
            objectMetadata.setContentLength(unencryptedDataLength);
            PutObjectRequest putRequest = new PutObjectRequest(destS3Uri.getBucket(), destS3Uri.getKey(),
                    sourceS3Object.getObjectContent(), objectMetadata);

            eTag = destS3Client.putObject(putRequest).getETag();

            if (eTag.isEmpty()) {
                System.out.println("Copy failed, New object in " + destS3Uri.toString() + " is empty");
                return false;
            }
 类似资料:
  • 我试图在corda中设置一个percona集群(mysql)以实现高可用性,我配置了其他所有内容,同时试图引入corda节点(公证),我得到以下错误:

  • 我正在user_views上运行一个查询。“TEXT”列是LONG数据类型的。所以,当我在where子句中使用该列时,我得到了预期的错误。 错误:ORA-00932:不一致的数据类型:预期数过长 查询是 这个怎么解决?

  • 以下是我的Java应用程序中的一个函数: 例如,在我的数据库中,我有和。因为我可以在我的查询中使用十进制运算,所以我的参数是一个,我在应用程序中输入20.00。 在我的数据对象中,是一个,是一个

  • 我正在尝试生成“原始”的未编码ECDSA签名,用于加密芯片。目标是在主机pc上签名,然后将其发送到芯片进行验证。然而,我遇到了一个小问题。我的理解是ECDSA签名应该是64字节(对于secp256v1)。而且,当我使用芯片生成签名时,它的长度确实是64字节。然而,当我使用openssl时,签名长度为71字节。签名的开头似乎是某种前缀,但我找不到关于它的任何数据。 以下是我尝试做每件事情的方式: 生

  • 假设我有一些账单,上面有开始日期和结束日期。 我要检查的商业规则是 例如,3月10日到4月9日大约相隔一个月,所以我用它来检查任何两个连续的账单开始日期(4月10日和3月10日)是否相隔一个月。 现在我的问题是求周期的长度。例如,假设我有以下数据集 我正在使用JodaTime库,所以我说类似这样的话 它返回0,这是正确的,但没有用处。 结果是1,尽管相隔一天。 有什么更好的方法来做到这一点?我可以

  • 问题内容: 我正在尝试获取新的数据集,或将当前数据集列的值更改为其唯一值。这是我尝试获得的示例: 我不太在乎索引,但这似乎是问题所在。到目前为止,我的代码非常简单,我尝试了两种方法,一种是使用新的dataFrame,另一种是不使用。 两次都出现错误“值的长度与索引的长度不匹配”。 问题答案: 当您尝试向数据帧分配不同长度的numpy数组列表时,会出现此错误,并且可以按以下方式重现该错误: 四行数据