上传时使用crc64校验文件一致性
您可以通过以下接口在上传时使用crc64校验文件一致性:
示例代码一:文件上传
以下代码展示如何在上传对象时使用CRC64校验一致性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA; 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 java.util.Map; public class PutObjectWithCRC64{ public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 上传本地文件 String exampleBucket = "examplebucket"; String localFilePath = "localfile"; String exampleObjectKey = "objectKey"; PutObjectRequest putObjectRequest = new PutObjectRequest(exampleBucket, exampleObjectKey, new File(localFilePath)); putObjectRequest.setNeedCalculateCRC64(true); PutObjectResult putObjectResult = obsClient.putObject(putObjectRequest); System.out.println( "Server returned crc64 string:" + putObjectResult.getResponseHeaders().get(HASH_CRC64ECMA)); System.out.println("PutObject successfully"); } catch (ObsException e) { System.out.println("PutObject failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); // 异常场景下打印所有头域,可能包含报错相关信息 Map<String, String> headers = e.getResponseHeaders(); if(headers != null){ for (Map.Entry<String, String> header : headers.entrySet()) { System.out.println(header.getKey()+":"+header.getValue()); } } e.printStackTrace(); } catch (Exception e) { System.out.println("PutObject failed"); // 其他异常信息打印 e.printStackTrace(); } } } |
示例代码二:追加上传
仅支持首次追加上传时使用CRC64校验文件一致性。
以下代码展示如何在使用追加上传时使用CRC64校验一致性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA; import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.AppendObjectRequest; import com.obs.services.model.AppendObjectResult; import java.io.File; import java.util.Map; public class AppendObjectWithCRC64{ public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 追加上传,仅支持第一次追加上传校验crc64 String exampleBucket = "examplebucket"; String localFilePath = "localfile"; String exampleObjectKey = "objectKeyAppend"; AppendObjectRequest appendObjectRequest = new AppendObjectRequest(exampleBucket); appendObjectRequest.setObjectKey(exampleObjectKey); appendObjectRequest.setFile(new File(localFilePath)); appendObjectRequest.setNeedCalculateCRC64(true); AppendObjectResult appendObjectResult = obsClient.appendObject(appendObjectRequest); System.out.println( "Server returned crc64 string:" + appendObjectResult.getResponseHeaders().get(HASH_CRC64ECMA)); System.out.println("AppendObject successfully"); } catch (ObsException e) { System.out.println("AppendObject failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); // 异常场景下打印所有头域,可能包含报错相关信息 Map<String, String> headers = e.getResponseHeaders(); if (headers != null) { for (Map.Entry<String, String> header : headers.entrySet()) { System.out.println(header.getKey() + ":" + header.getValue()); } } e.printStackTrace(); } catch (Exception e) { System.out.println("AppendObject failed"); // 其他异常信息打印 e.printStackTrace(); } } } |
示例代码三:分段上传
以下代码展示如何在使用分段上传时使用CRC64校验一致性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.internal.utils.CRC64; import com.obs.services.model.CompleteMultipartUploadRequest; import com.obs.services.model.CompleteMultipartUploadResult; import com.obs.services.model.InitiateMultipartUploadRequest; import com.obs.services.model.InitiateMultipartUploadResult; import com.obs.services.model.PartEtag; import com.obs.services.model.UploadPartRequest; import com.obs.services.model.UploadPartResult; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.obs.services.internal.Constants.CommonHeaders.HASH_CRC64ECMA; public class CompleteMultiPartUploadWithCRC64{ public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 分段上传 String exampleBucket = "examplebucket"; String localFilePath = "localfile"; String exampleObjectKey = "objectKey"; File exampleFile = new File(localFilePath); long exampleFileSize = exampleFile.length(); long partSize1 = exampleFileSize / 2; long partSize2 = exampleFileSize - partSize1; InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(exampleBucket, exampleObjectKey); InitiateMultipartUploadResult initiateMultipartUploadResult = obsClient.initiateMultipartUpload(initiateMultipartUploadRequest); String uploadId = initiateMultipartUploadResult.getUploadId(); UploadPartRequest uploadPartRequest = new UploadPartRequest(exampleBucket, exampleObjectKey, exampleFile); uploadPartRequest.setUploadId(uploadId); uploadPartRequest.setNeedCalculateCRC64(true); uploadPartRequest.setPartNumber(1); uploadPartRequest.setPartSize(partSize1); UploadPartResult uploadPartResult1 = obsClient.uploadPart(uploadPartRequest); CRC64 crc641 = uploadPartResult1.getClientCalculatedCRC64(); System.out.println( "Client calculated crc64_1 string:" + crc641.toString()); uploadPartRequest.setPartNumber(2); uploadPartRequest.setFile(exampleFile); uploadPartRequest.setOffset(partSize1); uploadPartRequest.setPartSize(partSize2); UploadPartResult uploadPartResult2 = obsClient.uploadPart(uploadPartRequest); CRC64 crc642 = uploadPartResult2.getClientCalculatedCRC64(); System.out.println( "Client calculated crc64_2 string:" + crc642.toString()); List<PartEtag> eTags = new ArrayList<>(); eTags.add(new PartEtag(uploadPartResult1.getEtag(), 1)); eTags.add(new PartEtag(uploadPartResult2.getEtag(), 2)); CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(exampleBucket, exampleObjectKey ,uploadId ,eTags); CRC64 crc64Combined = new CRC64(CRC64.combine(crc641.getValue(), crc642.getValue(), partSize2)); completeMultipartUploadRequest.addUserHeaders("x-obs-" + HASH_CRC64ECMA, crc64Combined.toString()); CompleteMultipartUploadResult completeMultipartUploadResult = obsClient.completeMultipartUpload(completeMultipartUploadRequest); System.out.println("Server returned completeMultipartUpload crc64 string:" + completeMultipartUploadResult.getResponseHeaders().get(HASH_CRC64ECMA)); System.out.println("CompleteMultipartUpload successfully"); } catch (ObsException e) { System.out.println("AppendObject failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); // 异常场景下打印所有头域,可能包含报错相关信息 Map<String, String> headers = e.getResponseHeaders(); if (headers != null) { for (Map.Entry<String, String> header : headers.entrySet()) { System.out.println(header.getKey() + ":" + header.getValue()); } } e.printStackTrace(); } catch (Exception e) { System.out.println("AppendObject failed"); // 其他异常信息打印 e.printStackTrace(); } } } |
示例代码四:断点续传上传
以下代码展示如何在断点续传上传时使用CRC64校验一致性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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 UploadFileWithCRC64{ public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { UploadFileRequest request = new UploadFileRequest("examplebucket", "objectKey"); // 设置待上传的本地文件,localfile为待上传的本地文件路径,需要指定到具体带文件后缀的文件名 request.setUploadFile("localfile"); // 设置分段上传时的最大并发数 request.setTaskNum(5); // 设置分段大小为10MB request.setPartSize(10 * 1024 * 1024); // 开启断点续传模式 request.setEnableCheckpoint(true); // 开启校验文件CRC64 request.setNeedCalculateCRC64(true); // 进行断点续传上传 CompleteMultipartUploadResult result = obsClient.uploadFile(request); System.out.println("Server returned crc64 string:" + result.getResponseHeaders().get(HASH_CRC64ECMA)); System.out.println("UploadFile successfully"); } catch (ObsException e) { // 发生异常时可再次调用断点续传上传接口进行重新上传 System.out.println("UploadFile failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("UploadFile failed"); // 其他异常信息打印 e.printStackTrace(); } } } |