更新时间:2026-09-10 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() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

示例代码二:追加上传

仅支持首次追加上传时使用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() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

示例代码三:分段上传

以下代码展示如何在使用分段上传时使用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() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

示例代码四:断点续传上传

以下代码展示如何在断点续传上传时使用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;

import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA;

public class UploadFileWithCRC64Demo {
    private static final String TAG = "UploadFileWithCRC64";

    public void uploadFileWithCRC64() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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 {
                    UploadFileRequest request = new UploadFileRequest("examplebucket", "objectname");
                    // 设置待上传的本地文件路径
                    request.setUploadFile("/sdcard/Download/localfile");
                    // 设置分段上传时的最大并发数
                    request.setTaskNum(5);
                    // 设置分段大小为10MB
                    request.setPartSize(10 * 1024 * 1024);
                    // 开启断点续传模式
                    request.setEnableCheckpoint(true);
                    // 开启校验文件CRC64
                    request.setNeedCalculateCRC64(true);
                    // 进行断点续传上传
                    CompleteMultipartUploadResult result = obsClient.uploadFile(request);
                    Log.i(TAG, "Server returned crc64 string:" + result.getResponseHeaders().get(HASH_CRC64ECMA));
                    Log.i(TAG, "UploadFile successfully");
                } 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());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

相关文档