tencent cloud

文档反馈

CRC64 校验

最后更新时间:2022-01-23 14:33:34

    简介

    数据在客户端和服务器间传输时可能会出现错误,对象存储(Cloud Object Storage,COS)除了可以通过 MD5 和自定义属性 验证数据完整性外,还可以通过 CRC64 检验码来进行数据校验。

    COS 会对新上传的对象进行 CRC64 计算,并将结果作为对象的属性进行存储,随后在返回的响应头部中携带 x-cos-hash-crc64ecma,该头部表示上传对象的 CRC64 值,根据 ECMA-182标准 计算得到。对于 CRC64 特性上线前就已经存在于 COS 的对象,COS 不会对其计算 CRC64 值,所以获取此类对象时不会返回其 CRC64 值。

    操作说明

    目前支持 CRC64 的 API 如下:

    • 简单上传接口
    • 分块上传接口
      • Upload Part:用户可以根据 COS 返回的 CRC64 值与本地计算的数值进行比较验证。
      • Complete Multipart Upload:如果每个分块都有 CRC64 属性,则会返回整个对象的 CRC64 值,如果某些分块不具备 CRC64 值,则不返回。
    • 执行 Upload Part - Copy 时,会返回对应的 CRC64 值。
    • 执行 PUT Object - Copy 时,如果源对象存在 CRC64 值,则返回 CRC64,否则不返回。
    • 执行 HEAD ObjectGET Object 时,如果对象存在 CRC64,则返回。用户可以根据 COS 返回的 CRC64 值和本地计算的 CRC64 进行比较验证。

    SDK API 参考

    SDK 所有接口的具体参数与方法说明,请参考 SDK API 参考

    SDK 说明

    您在上传或者下载成功后,可以在响应头部中获取 CRC64 值。

    注意:

    COS Android SDK 版本需要大于等于 v5.7.5。

    上传请求示例

    // 1. 初始化 TransferService。在相同配置的情况下,您应该复用同一个 TransferService
    TransferConfig transferConfig = new TransferConfig.Builder()
           .build();
    TransferService transferService = new TransferService(cosXmlService, transferConfig);
    // 2. 初始化 PutObjectRequest
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.intl.cloud.tencent.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即称对象键
    String srcPath = "examplefilepath"; //本地文件的绝对路径
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucket,
           cosPath, srcPath);
    // 3. 调用 upload 方法上传文件
    final COSUploadTask uploadTask = transferService.upload(putObjectRequest);
    uploadTask.setCosXmlResultListener(new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           // 上传成功,可以在这里拿到文件的 CRC64
           String crc64 = result.getHeader("x-cos-hash-crc64ecma");
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest request,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    下载请求示例

    // 1. 初始化 TransferService。在相同配置的情况下,您应该复用同一个 TransferService
    TransferConfig transferConfig = new TransferConfig.Builder()
           .build();
    TransferService transferService = new TransferService(cosXmlService, transferConfig);
    // 2. 初始化 GetObjectRequest
    // 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.intl.cloud.tencent.com/cos5/bucket
    String bucket = "examplebucket-1250000000";
    String cosPath = "exampleobject"; //对象在存储桶中的位置标识符,即称对象键
    String savePathDir = context.getCacheDir().toString(); //本地目录路径
    //本地保存的文件名,若不填(null),则与 COS 上的文件名一样
    String savedFileName = "exampleobject";
    GetObjectRequest getObjectRequest = new GetObjectRequest(bucket,
           cosPath, savePathDir, savedFileName);
    // 3. 调用 download 方法下载文件
    final COSDownloadTask downloadTask = transferService.download(getObjectRequest);
    downloadTask.setCosXmlResultListener(new CosXmlResultListener() {
       @Override
       public void onSuccess(CosXmlRequest request, CosXmlResult result) {
           // 下载成功,可以在这里拿到 COS 上的文件 CRC64
           String cosCRC64 = result.getHeader("x-cos-hash-crc64ecma");
       }
        // 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
       // clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
       @Override
       public void onFail(CosXmlRequest request,
                          @Nullable CosXmlClientException clientException,
                          @Nullable CosXmlServiceException serviceException) {
           if (clientException != null) {
               clientException.printStackTrace();
           } else {
               serviceException.printStackTrace();
           }
       }
    });
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    CRC64 校验

    通过 TransferService 进行上传和下载时,SDK 默认进行了数据校验的工作,如果您仍然希望能够自己进行 CRC64 校验,可以参考如下代码。

    // 1. 参考以上上传或者下载请求示例代码获取 COS 上文件的 CRC64 值
    String cosCRC64 = "examplecoscrc64";
    // 2. 计算本地文件的 CRC64
    File localFile = new File("examplefilepath");
    String localCRC64 = DigestUtils.getCRC64String(localFile);
    // 3. 比对 localCRC64 和 cosCRC64 是否一致
    if (localCRC64.equals(cosCRC64)) {
       // CRC64 对比正确
    }
    
    说明:

    更多完整示例,请前往 GitHub 查看。

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持