CRC64 校验

最近更新时间:2023-11-14 16:31:15

我的收藏

简介

数据在客户端和服务器间传输时可能会出现错误,对象存储(Cloud Object Storage,COS)除了可以通过 MD5 和自定义属性 验证数据完整性外,还可以通过 CRC64 检验码来进行数据校验。
COS 会对新上传的对象进行 CRC64 计算,并将结果作为对象的属性进行存储,随后在返回的响应头部中携带 x-cos-hash-crc64ecma,该头部表示上传对象的 CRC64 值,根据 ECMA-182标准 计算得到。对于 CRC64 特性上线前就已经存在于 COS 的对象,COS 不会对其计算 CRC64 值,所以获取此类对象时不会返回其 CRC64 值。

操作说明

目前支持 CRC64 的 API 如下:
简单上传接口
PUT ObjectPOST Object :用户可在返回的响应头中获得文件 CRC64 校验值。
分块上传接口
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.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.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 查看。