最近更新时间:2026-06-03 21:32:12
SDK 支持在上传文件时通过 CRC64 校验确保数据的完整性,在初始化 Ks3Client 时开启即可(默认开启),示例代码如下:
public Ks3Client initKs3Client() {
String endpoint = "ks3-cn-beijing.ksyuncs.com";
String accessKeyId = "yourAccessKey";
String accessKeySecret = "yourSecretKey";
Ks3ClientConfig config = new Ks3ClientConfig();
config.setEndpoint(endpoint);
// 设置是否进行 CRC64 校验
config.setCrcCheckEnabled(true);
return new Ks3Client(accessKeyId, accessKeySecret, config);
}
以下代码用于简单上传时校验数据的 CRC64:
String filePath = "/tmp/test-file";
// 初始化 ks3 client,参见“初始化”文档
Ks3Client client = initKs3Client();
// 使用 Crc64CheckedInputStream 作为输入流,流读取过程中计算 CRC64,读取完成就能得到最终的 CRC64 值
try (Crc64CheckedInputStream crc64CheckedInputStream = new Crc64CheckedInputStream(Files.newInputStream(new File(filePath).toPath()))) {
PutObjectResult putObjectResult = client.putObject("bucketName", "objectKey", crc64CheckedInputStream);
// 校验 CRC64
String serverCrc64 = putObjectResult.getCrc64Ecma();
String clientCrc64 = crc64CheckedInputStream.getCrc64Ecma();
if (StringUtils.isNotBlank(serverCrc64) && StringUtils.isNotBlank(clientCrc64) && !Objects.equals(serverCrc64, clientCrc64)) {
System.out.println("CRC64 not matched, please delete the object on ks3 and upload again");
}
} catch (IOException e) {
log.error("Put object Error", e);
}
SDK 支持在上传时自动校验 CRC64,若用户需自行校验,可参考以下代码。
String bucketName = "my-bucket";
String objectKey = "test-object";
// 初始化 ks3 client,参见“初始化”文档
Ks3Client client = initKs3Client();
// 初始化分块上传
String uploadId = client.initiateMultipartUpload(bucketName, objectKey).getUploadId();
List<PartETag> partETagList = new ArrayList<>();
// 上传文件块,这里仅示例上传 1 块
byte[] bytes = "this is a test file\n".getBytes(StandardCharsets.UTF_8);
// 使用 Crc64CheckedInputStream 作为输入流,流读取过程中计算 CRC64,读取完成就能得到最终的 CRC64 值
try (Crc64CheckedInputStream crc64CheckedInputStream = new Crc64CheckedInputStream(new ByteArrayInputStream(bytes));) {
UploadPartRequest uploadPartRequest = new UploadPartRequest(bucketName, objectKey, uploadId, 1, crc64CheckedInputStream, bytes.length);
PartETag partETag = client.uploadPart(uploadPartRequest);
// 校验 CRC64
String serverCrc64 = partETag.getCrc64Ecma();
String clientCrc64 = crc64CheckedInputStream.getCrc64Ecma();
if (StringUtils.isNotBlank(serverCrc64) && StringUtils.isNotBlank(clientCrc64) && !Objects.equals(serverCrc64, clientCrc64)) {
throw new RuntimeException("CRC64 not matched, please upload this part again");
} else {
partETagList.add(partETag);
}
} catch (IOException e) {
log.error("Upload part Error", e);
}
// 完成分块上传
client.completeMultipartUpload(bucketName, objectKey, uploadId, partETagList);
// 初始化 ks3 client,参见“初始化”文档
Ks3Client client = initKs3Client();
String downloadFilePath = "/data/my-file";
// 下载文件
GetObjectResult objectResult = client.getObject("bucketName", "objectKey");
// 使用 Crc64CheckedInputStream 作为输入流,流读取过程中计算 CRC64,读取完成就能得到最终的 CRC64 值
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(downloadFilePath));
Crc64CheckedInputStream inputStream = new Crc64CheckedInputStream(objectResult.getObject().getObjectContent())) {
byte[] buffer = new byte[1024 * 1024];
while (true) {
int bytesRead = inputStream.read(buffer);
if (bytesRead == -1) {
break;
}
bufferedOutputStream.write(buffer, 0, bytesRead);
}
// 校验 CRC64
String serverCrc64 = objectResult.getObject().getCrc64Ecma();
String clientCrc64 = inputStream.getCrc64Ecma();
if (StringUtils.isNotBlank(serverCrc64) && StringUtils.isNotBlank(clientCrc64) && !Objects.equals(serverCrc64, clientCrc64)) {
System.out.println("CRC64 not matched, please delete the file and download again");
}
} catch (IOException e) {
log.error("Get object Error", e);
}
// 初始化 ks3 client,参见“初始化”文档
Ks3Client client = initKs3Client();
HeadObjectResult headObjectResult = client.headObject("bucketName", "objectKey");
String crc64Ecma = headObjectResult.getObjectMetadata().getCrc64Ecma();
System.out.println("Object CRC64: " + crc64Ecma);
纯净模式
