更新时间: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());
        }
    }
}