更新时间:2026-08-14 GMT+08:00
上传时使用crc64校验文件一致性
您可以通过以下接口在上传时使用crc64校验文件一致性:
示例代码一:文件上传
以下代码展示如何在上传对象时使用CRC64校验一致性。
import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.PutObjectRequest;
import com.obs.services.model.PutObjectResult;
import java.io.File;
import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA;
public class PutObjectWithCRC64Demo {
private static final String TAG = "PutObjectWithCRC64";
public void putObjectWithCRC64() {
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
try {
// 上传本地文件并开启CRC64校验
String bucketName = "examplebucket";
String objectKey = "objectname";
String localFilePath = "/sdcard/Download/localfile";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new File(localFilePath));
// 开启CRC64校验
putObjectRequest.setNeedCalculateCRC64(true);
PutObjectResult putObjectResult = obsClient.putObject(putObjectRequest);
Log.i(TAG, "Server returned crc64 string:" + putObjectResult.getResponseHeaders().get(HASH_CRC64ECMA));
Log.i(TAG, "PutObject successfully");
} catch (ObsException e) {
Log.e(TAG, "PutObject failed");
// 请求失败,打印http状态码
Log.e(TAG, "HTTP Code:" + e.getResponseCode());
// 请求失败,打印服务端错误码
Log.e(TAG, "Error Code:" + e.getErrorCode());
// 请求失败,打印详细错误信息
Log.e(TAG, "Error Message:" + e.getErrorMessage());
// 请求失败,打印请求id
Log.e(TAG, "Request ID:" + e.getErrorRequestId());
Log.e(TAG, "Host ID:" + e.getErrorHostId());
} catch (Exception e) {
Log.e(TAG, "PutObject failed");
// 其他异常信息打印
Log.e(TAG, e.getMessage());
}
}
} 示例代码二:追加上传
仅支持首次追加上传时使用CRC64校验文件一致性。
以下代码展示如何在使用追加上传时使用CRC64校验一致性。
import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.AppendObjectRequest;
import com.obs.services.model.AppendObjectResult;
import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA;
public class AppendObjectWithCRC64Demo {
private static final String TAG = "AppendObjectWithCRC64";
public void appendObjectWithCRC64() {
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
try {
String bucketName = "examplebucket";
String objectKey = "objectname";
// 第一次追加上传
AppendObjectRequest request1 = new AppendObjectRequest();
request1.setBucketName(bucketName);
request1.setObjectKey(objectKey);
request1.setInput(new java.io.ByteArrayInputStream("Hello OBS ".getBytes()));
request1.setPosition(0);
// 开启CRC64校验
request1.setNeedCalculateCRC64(true);
AppendObjectResult result1 = obsClient.appendObject(request1);
String crc64AfterFirstAppend = result1.getResponseHeaders().get(HASH_CRC64ECMA);
Log.i(TAG, "First append successfully, crc64: " + crc64AfterFirstAppend);
Log.i(TAG, "Next position: " + result1.getNextPosition());
// 第二次追加上传,需传入上一次追加的CRC64值
AppendObjectRequest request2 = new AppendObjectRequest();
request2.setBucketName(bucketName);
request2.setObjectKey(objectKey);
request2.setInput(new java.io.ByteArrayInputStream("Hello World".getBytes()));
request2.setPosition(result1.getNextPosition());
// 开启CRC64校验
request2.setNeedCalculateCRC64(true);
// 设置上一次追加返回的CRC64值,用于链式校验
request2.setCrc64BeforeAppend(crc64AfterFirstAppend);
AppendObjectResult result2 = obsClient.appendObject(request2);
Log.i(TAG, "Second append successfully, crc64: " + result2.getResponseHeaders().get(HASH_CRC64ECMA));
Log.i(TAG, "Next position: " + result2.getNextPosition());
} catch (ObsException e) {
Log.e(TAG, "AppendObject failed");
Log.e(TAG, "HTTP Code:" + e.getResponseCode());
Log.e(TAG, "Error Code:" + e.getErrorCode());
Log.e(TAG, "Error Message:" + e.getErrorMessage());
Log.e(TAG, "Request ID:" + e.getErrorRequestId());
Log.e(TAG, "Host ID:" + e.getErrorHostId());
} catch (Exception e) {
Log.e(TAG, "AppendObject failed");
Log.e(TAG, e.getMessage());
}
}
} 示例代码三:分段上传
以下代码展示如何在使用分段上传时使用CRC64校验一致性。
import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.InitiateMultipartUploadRequest;
import com.obs.services.model.InitiateMultipartUploadResult;
import com.obs.services.model.UploadPartRequest;
import com.obs.services.model.UploadPartResult;
import com.obs.services.model.CompleteMultipartUploadRequest;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.PartEtag;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA;
public class UploadPartWithCRC64Demo {
private static final String TAG = "UploadPartWithCRC64";
public void uploadPartWithCRC64() {
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
try {
String bucketName = "examplebucket";
String objectKey = "objectname";
// 1. 初始化分段上传任务
InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest(bucketName, objectKey);
InitiateMultipartUploadResult initiateResult = obsClient.initiateMultipartUpload(initiateRequest);
String uploadId = initiateResult.getUploadId();
Log.i(TAG, "Initiate multipart upload, uploadId: " + uploadId);
// 2. 上传分段并开启CRC64校验
List<PartEtag> partList = new ArrayList<>();
String[] contents = {"Hello ", "OBS ", "World!"};
for (int i = 0; i < contents.length; i++) {
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setObjectKey(objectKey);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(i + 1);
uploadPartRequest.setInput(new ByteArrayInputStream(contents[i].getBytes()));
uploadPartRequest.setPartSize(contents[i].getBytes().length);
// 开启CRC64校验
uploadPartRequest.setNeedCalculateCRC64(true);
UploadPartResult uploadPartResult = obsClient.uploadPart(uploadPartRequest);
Log.i(TAG, "Part " + (i + 1) + " uploaded, crc64: "
+ uploadPartResult.getResponseHeaders().get(HASH_CRC64ECMA));
partList.add(new PartEtag(uploadPartResult.getEtag(), uploadPartResult.getPartNumber()));
}
// 3. 合并分段
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest();
completeRequest.setBucketName(bucketName);
completeRequest.setObjectKey(objectKey);
completeRequest.setUploadId(uploadId);
completeRequest.setPartEtag(partList);
CompleteMultipartUploadResult completeResult = obsClient.completeMultipartUpload(completeRequest);
Log.i(TAG, "Complete multipart upload successfully");
Log.i(TAG, "Object crc64: " + completeResult.getResponseHeaders().get(HASH_CRC64ECMA));
} catch (ObsException e) {
Log.e(TAG, "UploadPart failed");
Log.e(TAG, "HTTP Code:" + e.getResponseCode());
Log.e(TAG, "Error Code:" + e.getErrorCode());
Log.e(TAG, "Error Message:" + e.getErrorMessage());
Log.e(TAG, "Request ID:" + e.getErrorRequestId());
Log.e(TAG, "Host ID:" + e.getErrorHostId());
} catch (Exception e) {
Log.e(TAG, "UploadPart failed");
Log.e(TAG, e.getMessage());
}
}
} 示例代码四:断点续传上传
以下代码展示如何在断点续传上传时使用CRC64校验一致性。
import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.UploadFileRequest;
public class UploadFileWithCRC64Demo {
private static final String TAG = "UploadFileWithCRC64";
public void uploadFileWithCRC64() {
// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。
String endPoint = "https://your-endpoint";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
try {
// 断点续传上传并开启CRC64校验
UploadFileRequest request = new UploadFileRequest("examplebucket", "objectname");
request.setUploadFile("/sdcard/Download/localfile");
// 开启CRC64校验
request.setNeedCalculateCRC64(true);
CompleteMultipartUploadResult result = obsClient.uploadFile(request);
Log.i(TAG, "UploadFile successfully");
Log.i(TAG, "HTTP Code:" + result.getStatusCode());
} catch (ObsException e) {
Log.e(TAG, "UploadFile failed");
Log.e(TAG, "HTTP Code:" + e.getResponseCode());
Log.e(TAG, "Error Code:" + e.getErrorCode());
Log.e(TAG, "Error Message:" + e.getErrorMessage());
Log.e(TAG, "Request ID:" + e.getErrorRequestId());
Log.e(TAG, "Host ID:" + e.getErrorHostId());
} catch (Exception e) {
Log.e(TAG, "UploadFile failed");
Log.e(TAG, e.getMessage());
}
}
} 父主题: 校验文件一致性