




<AccessControlPolicy><Owner><ID>qcs::cam::uin/100000000001:uin/100000000001</ID></Owner><AccessControlList><Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RootAccount"><ID>qcs::cam::uin/100000000001:uin/100000000001</ID></Grantee><Permission>FULL_CONTROL</Permission></Grant></AccessControlList></AccessControlPolicy>












package mainimport ("context""fmt""os""net/url""net/http""github.com/tencentyun/cos-go-sdk-v5""github.com/tencentyun/cos-go-sdk-v5/debug")func log_status(err error) {if err == nil {return}if cos.IsNotFoundError(err) {// WARNfmt.Println("WARN: Resource is not existed: %v", err)} else if e, ok := cos.IsCOSError(err); ok {fmt.Printf("ERROR: Code: %v\\n", e.Code)fmt.Printf("ERROR: Message: %v\\n", e.Message)fmt.Printf("ERROR: Resource: %v\\n", e.Resource)fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)// ERROR} else {fmt.Printf("ERROR: %v\\n", err)// ERROR}}var (srcBucket = "test-1259654469"srcBucketRegion = "ap-guangzhou"srcCosClient *cos.ClientcopyObjs = map[string]struct{}{})func newClient(bucket, region string) *cos.Client {u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))b := &cos.BaseURL{BucketURL: u,}return cos.NewClient(b, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_SECRETID"),SecretKey: os.Getenv("COS_SECRETKEY"),Transport: &debug.DebugRequestTransport{RequestHeader: false,RequestBody: false,ResponseHeader: false,ResponseBody: false,},},})}func recoverObj(key, versionId string) {sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)_, _, err := srcCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)if err != nil {log_status(err)}}func main() {srcCosClient = newClient(srcBucket, srcBucketRegion)keyMarker := ""versionIdMarker := ""isTruncated := trueopt := &cos.BucketGetObjectVersionsOptions{EncodingType: "url",}for isTruncated {opt.KeyMarker = keyMarkeropt.VersionIdMarker = versionIdMarkerv, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)if err != nil {log_status(err)break}for _, vc := range v.DeleteMarker {if vc.IsLatest {// 객체가 삭제되었으며, 복구가 필요합니다copyObjs[vc.Key] = struct{}{}}}for _, vc := range v.Version {// 최신으로 복구if _, ok := copyObjs[vc.Key]; ok {delete(copyObjs, vc.Key)key, _ := cos.DecodeURIComponent(vc.Key)fmt.Printf("key: %v, versionId: %v\\n", key, vc.VersionId)recoverObj(key, vc.VersionId)}}keyMarker = v.NextKeyMarkerversionIdMarker = v.NextVersionIdMarkerisTruncated = v.IsTruncated}}
package mainimport ("context""fmt""os""net/url""net/http""github.com/tencentyun/cos-go-sdk-v5""github.com/tencentyun/cos-go-sdk-v5/debug")func log_status(err error) {if err == nil {return}if cos.IsNotFoundError(err) {// WARNfmt.Println("WARN: Resource is not existed: %v", err)} else if e, ok := cos.IsCOSError(err); ok {fmt.Printf("ERROR: Code: %v\\n", e.Code)fmt.Printf("ERROR: Message: %v\\n", e.Message)fmt.Printf("ERROR: Resource: %v\\n", e.Resource)fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)// ERROR} else {fmt.Printf("ERROR: %v\\n", err)// ERROR}}var (srcBucket = "test-1259654469"dstBucket = "test2-1259654469"srcBucketRegion = "ap-guangzhou"dstBucketRegion = "ap-guangzhou"srcCosClient *cos.ClientdstCosClient *cos.Client)func newClient(bucket, region string) *cos.Client {u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))b := &cos.BaseURL{BucketURL: u,}return cos.NewClient(b, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_SECRETID"),SecretKey: os.Getenv("COS_SECRETKEY"),Transport: &debug.DebugRequestTransport{RequestHeader: false,RequestBody: false,ResponseHeader: false,ResponseBody: false,},},})}func recoverObj(key, versionId string) {sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)_, _, err := dstCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)if err != nil {log_status(err)}}func main() {srcCosClient = newClient(srcBucket, srcBucketRegion)dstCosClient = newClient(dstBucket, dstBucketRegion)keyMarker := ""versionIdMarker := ""isTruncated := trueopt := &cos.BucketGetObjectVersionsOptions{EncodingType: "url",}var preKey stringfor isTruncated {opt.KeyMarker = keyMarkeropt.VersionIdMarker = versionIdMarkerv, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)if err != nil {log_status(err)break}for _, vc := range v.Version {// 최신 deletemarker가 아닌 객체if preKey != vc.Key {preKey = vc.Keykey, _ := cos.DecodeURIComponent(vc.Key)fmt.Printf("key: %v, versionId: %v, lastest: %v\\n", key, vc.VersionId, vc.IsLatest)recoverObj(key, vc.VersionId)}}keyMarker = v.NextKeyMarkerversionIdMarker = v.NextVersionIdMarkerisTruncated = v.IsTruncated}}
import com.qcloud.cos.COSClient;import com.qcloud.cos.ClientConfig;import com.qcloud.cos.auth.BasicCOSCredentials;import com.qcloud.cos.auth.COSCredentials;import com.qcloud.cos.exception.CosClientException;import com.qcloud.cos.exception.CosServiceException;import com.qcloud.cos.http.HttpProtocol;import com.qcloud.cos.model.COSVersionSummary;import com.qcloud.cos.model.CopyObjectRequest;import com.qcloud.cos.model.CopyObjectResult;import com.qcloud.cos.model.ListVersionsRequest;import com.qcloud.cos.model.VersionListing;import com.qcloud.cos.region.Region;import java.util.List;import java.util.Objects;public class RecoverObjectsDemo {private static String secretId = "************************************";private static String secretKey = "************************************";private static String bucketName = "examplebucket-12500000000";private static String bucketRegion = "ap-guangzhou";private static COSClient cosClient = createCli();public static void main(String[] args) {listAndRecoverObjs();}private static COSClient createCli() {// 1 사용자 신원 정보 초기화(secretId, secretKey)COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// 2 버킷의 지역을 설정합니다. COS 리전의 약칭은 https://www.qcloud.com/document/product/436/6224를 참조하십시오.ClientConfig clientConfig = new ClientConfig(new Region(bucketRegion));clientConfig.setHttpProtocol(HttpProtocol.https);// cos 클라이언트 생성return new COSClient(cred, clientConfig);}private static void listAndRecoverObjs() {ListVersionsRequest listVersionsRequest = new ListVersionsRequest();listVersionsRequest.setBucketName(bucketName);listVersionsRequest.setPrefix("");listVersionsRequest.setMaxResults(1000);VersionListing versionListing = null;String recover_key = "";String recover_versionid = "";boolean has_recovered = false;do {try {versionListing = cosClient.listVersions(listVersionsRequest);} catch (CosServiceException e) {e.printStackTrace();return;} catch (CosClientException e) {e.printStackTrace();return;}List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {String key = cosVersionSummary.getKey();String versionId = cosVersionSummary.getVersionId();boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();boolean isLatest = cosVersionSummary.isLatest();String msg = String.format("list obj, Key[%s], Version[%s], isDeleteMarker[%s], isLatest[%s]", key, versionId, isDeleteMarker, isLatest);System.out.println(msg);if (isDeleteMarker && isLatest) {// 삭제 표시된 최신 versionid의 객체만 복구recover_key = key;has_recovered = false;} else if (!isDeleteMarker && !isLatest && Objects.equals(key, recover_key) && !has_recovered) {// 최신 버전도 아니고 삭제 표시도 아닌 경우, key가 recover_key와 같다면 복구할 데이터 버전을 찾았다는 의미입니다. 복구 로직을 실행합니다.recover_versionid = versionId;recoverObj(recover_key, recover_versionid);has_recovered = true;}}String keyMarker = versionListing.getNextKeyMarker();String versionIdMarker = versionListing.getNextVersionIdMarker();listVersionsRequest.setKeyMarker(keyMarker);listVersionsRequest.setVersionIdMarker(versionIdMarker);} while (versionListing.isTruncated());}private static void recoverObj(String srcKey, String srcVersionId) {String dstKey = srcKey;CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(bucketRegion), bucketName, srcKey, bucketName, dstKey);copyObjectRequest.setSourceVersionId(srcVersionId);try {CopyObjectResult result = cosClient.copyObject(copyObjectRequest);String msg = String.format("finish recover by copying obj, srcKey[%s], srcVersion[%s], dstKey[%s], dstVersion[%s]", srcKey, srcVersionId, dstKey, result.getVersionId());System.out.println(msg);} catch (CosServiceException cse) {cse.printStackTrace();} catch (CosClientException cce) {cce.printStackTrace();}}}
import com.qcloud.cos.COSClient;import com.qcloud.cos.ClientConfig;import com.qcloud.cos.auth.BasicCOSCredentials;import com.qcloud.cos.auth.COSCredentials;import com.qcloud.cos.exception.CosClientException;import com.qcloud.cos.exception.CosServiceException;import com.qcloud.cos.http.HttpProtocol;import com.qcloud.cos.model.CopyObjectRequest;import com.qcloud.cos.model.CopyObjectResult;import com.qcloud.cos.model.COSVersionSummary;import com.qcloud.cos.model.ListVersionsRequest;import com.qcloud.cos.model.VersionListing;import com.qcloud.cos.region.Region;import java.util.ArrayList;import java.util.List;public class RecoverObjectsDemo2 {private static String secretId = "************************************";private static String secretKey = "************************************";private static String srcbucketName = "examplebucket-backup-12500000000";private static String dstbucketName = "examplebucket-dest-12500000000";private static String srcbucketRegion = "ap-guangzhou";private static String dstbucketRegion = "ap-shanghai";private static List<String> copyobjs = new ArrayList<>();private static COSClient srcCosClient = createCli(srcbucketRegion);private static COSClient dstCosClient = createCli(dstbucketRegion);public static void main(String[] args) {listAndRecoverObjs();}private static COSClient createCli(String region) {// 1 사용자 신원 정보 초기화(secretId, secretKey)COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// 2 버킷의 지역을 설정합니다. COS 리전의 약칭은 https://www.qcloud.com/document/product/436/6224를 참조하십시오.ClientConfig clientConfig = new ClientConfig(new Region(region));clientConfig.setHttpProtocol(HttpProtocol.https);// cos 클라이언트 생성return new COSClient(cred, clientConfig);}private static void recoverObj(String srcKey, String srcVersionId) {String dstKey = srcKey;CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(srcbucketRegion), srcbucketName, srcKey, dstbucketName, dstKey);copyObjectRequest.setSourceVersionId(srcVersionId);try {CopyObjectResult result = dstCosClient.copyObject(copyObjectRequest);String msg = String.format("finish recover by copying obj, srcBucket[%s], srcKey[%s], srcVersion[%s], dstBucket[%s], dstKey[%s], dstVersion[%s]",srcbucketName, srcKey, srcVersionId, dstbucketName, dstKey, result.getVersionId());System.out.println(msg);copyobjs.add(srcKey);} catch (CosServiceException cse) {cse.printStackTrace();} catch (CosClientException cce) {cce.printStackTrace();}}private static void listAndRecoverObjs() {ListVersionsRequest listVersionsRequest = new ListVersionsRequest();listVersionsRequest.setBucketName(srcbucketName);listVersionsRequest.setPrefix("");VersionListing versionListing = null;do {try {versionListing = srcCosClient.listVersions(listVersionsRequest);} catch (CosServiceException e) {e.printStackTrace();return;} catch (CosClientException e) {e.printStackTrace();return;}List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {String key = cosVersionSummary.getKey();String versionId = cosVersionSummary.getVersionId();boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();boolean isLatest = cosVersionSummary.isLatest();if (!isDeleteMarker) {if (isLatest) {System.out.println("latest object, will copy " + "key:" + key + ", versionId:" + versionId);recoverObj(key, versionId);} else {if (!copyobjs.contains(key)) {System.out.println("not latest object, will copy " + "key:" + key + ", versionId:" + versionId);recoverObj(key, versionId);}}}}String keyMarker = versionListing.getNextKeyMarker();String versionIdMarker = versionListing.getNextVersionIdMarker();listVersionsRequest.setKeyMarker(keyMarker);listVersionsRequest.setVersionIdMarker(versionIdMarker);} while (versionListing.isTruncated());System.out.println("--------------------------------------");}}
# -*- coding=utf-8from qcloud_cos import CosConfigfrom qcloud_cos import CosS3Clientimport sysimport osimport logging# logging.basicConfig(level=logging.INFO, stream=sys.stdout)def _recover_main(src_region, src_bucket, secret_id, secret_key, prefix):src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))# 열거 작업의 페이징 매개변수key_marker = ''versionId_marker = ''recovered_keys = set() # 복구된 객체를 기록하는 데 사용됩니다.while True:response = src_client.list_objects_versions(Bucket=src_bucket,Prefix=prefix,KeyMarker=key_marker,VersionIdMarker=versionId_marker,)delete_marker_keys = set()# DeleteMarker에서 삭제된 객체 가져오기if 'DeleteMarker' in response:for version in response['DeleteMarker']:if version['IsLatest'] == 'true':delete_marker_keys.add(version['Key'])if len(delete_marker_keys) == 0:print('no delete markers found, no data to recover, continue listing')# Version에서 복구용 객체 버전 가져오기if 'Version' in response:for version in response['Version']:key = version['Key']versionId = version['VersionId']if key in delete_marker_keys and not key in recovered_keys:print('recover from object: {src_bucket}/{key}(versionId:{versionId})'.format(src_bucket=src_bucket, key=key, versionId=versionId))try:src_client.copy(Bucket=src_bucket,Key=key,CopySource={'Bucket': src_bucket,'Key': key,'Region': src_region,'VersionId': versionId,})recovered_keys.add(key)print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {src_bucket}/{key}".format(src_bucket=src_bucket, key=key, versionId=versionId))except Exception as e:print(e)passif response['IsTruncated'] == 'false':breakkey_marker = response['NextKeyMarker']versionId_marker = response['NextVersionIdMarker']if __name__ == '__main__':# 사용 시나리오:# 소스 버킷 src_bucket의 삭제 표시를 통해 이전 버전에서 파일을 복구합니다.# 소스 버킷 정보src_region = 'ap-guangzhou' # 소스 리전src_bucket = 'bucket-1250000000' # 소스 버킷 이름# 환경 변수에서 비밀번호 가져오기secret_id = os.environ['COS_SECRET_ID']secret_key = os.environ['COS_SECRET_KEY']prefix = '' # 복구할 객체의 접두사 설정, 예: 'docs/'. 기본값으로 빈 문자열은 모든 객체를 복구함을 의미합니다_recover_main(src_region=src_region,src_bucket=src_bucket,secret_id=secret_id,secret_key=secret_key,prefix=prefix)
# -*- coding=utf-8from qcloud_cos import CosConfigfrom qcloud_cos import CosS3Clientimport sysimport osimport logging# logging.basicConfig(level=logging.INFO, stream=sys.stdout)def _recover_main(src_region, src_bucket, dst_region, dst_bucket, secret_id, secret_key, prefix):src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))dst_client = CosS3Client(CosConfig(Region=dst_region, SecretId=secret_id, SecretKey=secret_key))# 열거 작업의 페이징 매개변수key_marker = ''versionId_marker = ''recovered_keys = set() # 복구된 객체를 기록합니다.while True:response = src_client.list_objects_versions(Bucket=src_bucket,Prefix=prefix,KeyMarker=key_marker,VersionIdMarker=versionId_marker,)# Version에서 복구용 객체 버전 가져오기if 'Version' in response:for version in response['Version']:key = version['Key']versionId = version['VersionId']if not key in recovered_keys:print('recover from object: {src_bucket}/{key}(versionId={versionId})'.format(src_bucket=src_bucket, key=key, versionId=versionId))try:dst_client.copy(Bucket=dst_bucket,Key=key,CopySource={'Bucket': src_bucket,'Key': key,'Region': src_region,'VersionId': versionId,})recovered_keys.add(key)print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {dst_bucket}/{key}".format(src_bucket=src_bucket, key=key, versionId=versionId, dst_bucket=dst_bucket))except Exception as e:print(e)passif response['IsTruncated'] == 'false':breakkey_marker = response['NextKeyMarker']versionId_marker = response['NextVersionIdMarker']if __name__ == '__main__':# 사용 시나리오:# src_bucket: 백업 버킷# dst_bucket: 대상 버킷# 대상 버킷(dst_bucket)의 객체가 실수로 삭제된 경우, 백업 버킷(src_bucket)의 객체를 순회하여 삭제 표시가 없는 현재 버전 객체를 선택한 후 대상 버킷(dst_bucket)으로 복사하여 복구를 완료합니다.# 백업 버킷 정보src_region = 'ap-guangzhou'src_bucket = 'bucket-backup-1250000000'# 대상 버킷 정보dst_region = 'ap-guangzhou'dst_bucket = 'bucket-1250000000'# 환경 변수에서 비밀번호 가져오기secret_id = os.environ['COS_SECRET_ID']secret_key = os.environ['COS_SECRET_KEY']prefix = '' # 복구할 객체의 접두사 설정, 예: 'docs/'. 기본값으로 빈 문자열은 모든 객체를 복구함을 의미합니다_recover_main(src_region=src_region,src_bucket=src_bucket,dst_region=dst_region,dst_bucket=dst_bucket,secret_id=secret_id,secret_key=secret_key,prefix=prefix)
DELETE /exampleobject?versionId=MTg0NDUxNzgyODk2ODc1NjY0NzQ HTTP/1.1Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.comDate: Wed, 14 Aug 2019 12:00:42 GMTAuthorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1565784042;1565791242&q-key-time=1565784042;1565791242&q-header-list=date;host&q-url-param-list=versionid&q-signature=****************************************Connection: close
HTTP/1.1 204 No Content Content-Length: 0 Connection: close Date: Wed, 14 Aug 2019 12:00:42 GMT Server: tencent-cos x-cos-delete-marker: true x-cos-request-id: NWQ1M2Y3ZWFfNzljMDBiMDlfMjkyMDJfMWRjNjVm**** x-cos-version-id: MTg0NDUxNzgyODk2ODc1NjY0NzQ
response = client.delete_object( Bucket='examplebucket-1250000000', Key='exampleobject', VersionId='string' )

PUT /exampleobject HTTP/1.1Host: destinationbucket-1250000000.cos.ap-beijing.myqcloud.comDate: Sat, 11 Apr 2020 17:51:35 GMTx-cos-copy-source: sourcebucket-1250000001.cos.ap-shanghai.myqcloud.com/example.jpg?versionId=MTg0NDUxNTc0NDYyMjQ2MzUzMjQContent-Length: 0Authorization: q-sign-algorithm=sha1&q-ak=************************************&q-sign-time=1586627495;1586634695&q-key-time=1586627495;1586634695&q-header-list=content-length;date;host;x-cos-copy-source&q-url-param-list=&q-signature=****************************************Connection: close
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 219 Connection: close Date: Sat, 11 Apr 2020 17:51:35 GMT Server: tencent-cos x-cos-copy-source-version-id: MTg0NDUxNTc0NDYyMjQ2MzUzMjQ x-cos-request-id: NWU5MjAzYTdfMWZjMDJhMDlfNTE4N18zNGU2**** <?xml version="1.0" encoding="UTF-8"?> <CopyObjectResult> <ETag>"ee8de918d05640145b18f70f4c3aa602"</ETag> <CRC64>16749565679157681890</CRC64> <LastModified>2020-04-11T17:51:35Z</LastModified> </CopyObjectResult>
response = client.copy( Bucket='examplebucket-1250000000', Key='exampleobject', CopySource={ 'Bucket': 'examplebucket-1250000000', 'Key': 'exampleobject', 'Region': 'ap-guangzhou', 'VersionId': 'String' } )

Esta página foi útil?
Você também pode entrar em contato com a Equipe de vendas ou Enviar um tíquete em caso de ajuda.
comentários