PUT /exampleobject HTTP/1.1Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.comDate: Fri, 21 Jun 2019 09:24:28 GMTContent-Type: image/jpegContent-Length: 13Content-MD5: ti4QvKtVqIJAvZxDbP/c+Q==Authorization: q-sign-algorithm=sha1&q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****&q-sign-time=1561109068;1561116268&q-key-time=1561109068;1561116268&q-header-list=content-length;content-md5;content-type;date;host&q-url-param-list=&q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9Connection: close[Object Content]
POST /exampleobject?uploads HTTP/1.1Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.comDate: Fri, 21 Jun 2019 09:45:12 GMTAuthorization: q-sign-algorithm=sha1&q-ak=AKID8A0fBVtYFrNm02oY1g1JQQF0c3JO****&q-sign-time=1561109068;1561116268&q-key-time=1561109068;1561116268&q-header-list=content-length;content-md5;content-type;date;host&q-url-param-list=&q-signature=998bfc8836fc205d09e455c14e3d7e623bd2****x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9
HTTP/1.1 200 OKContent-Type: application/octet-streamContent-Length: 13Connection: closeAccept-Ranges: bytesCache-Control: max-age=86400Content-Disposition: attachment; filename=example.jpgDate: Thu, 04 Jul 2019 11:33:00 GMTETag: "b62e10bcab55a88240bd9c436cffdcf9"Last-Modified: Thu, 04 Jul 2019 11:32:55 GMTServer: tencent-cosx-cos-request-id: NWQxZGUzZWNfNjI4NWQ2NF9lMWYyXzk1NjFj****x-cos-meta-md5: b62e10bcab55a88240bd9c436cffdcf9[Object Content]
# -*- coding=utf-8from qcloud_cos import CosConfigfrom qcloud_cos import CosS3Clientfrom qcloud_cos import CosServiceErrorfrom qcloud_cos import CosClientErrorimport sysimport osimport loggingimport hashliblogging.basicConfig(level=logging.INFO, stream=sys.stdout)# SecretId, SecretKey, Region을 포함한 사용자 속성을 설정합니다.# APPID는 설정에서 삭제되었으니 매개변수 Bucket에 APPID를 입력하십시오. Bucket은 BucketName-APPID로 구성됩니다.secret_id = os.environ['COS_SECRET_ID'] # 사용자 SecretId. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1secret_key = os.environ['COS_SECRET_KEY'] # 사용자 SecretKey. 리스크를 줄이기 위해 서브 계정 키를 사용하고 최소 권한 원칙을 따르는 것이 좋습니다. 서브 계정 키를 가져오는 방법에 대한 자세한 내용은 다음을 참고하십시오. https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1region = 'ap-beijing' # 사용자 Region으로 대체, 예시는 베이징 리전token = None # 임시 키 Token. 임시 키 생성 및 사용 방법에 대한 자세한 내용은 다음을 참고하십시오. https://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 구성된 객체 가져오기client = CosS3Client(config)
object_body = 'hello cos'#객체의 md5 해시값 획득md5 = hashlib.md5()md5.update(object_body)md5_str = md5.hexdigest()
#간편한 객체 업로드 및 MD5 검사 활성화response = client.put_object(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.Body='hello cos', #업로드한 객체 콘텐츠Key='example-object-1', #업로드한 객체의 Key 값으로 대체EnableMD5=True, #업로드한 MD5 검사 활성화Metadata={ #사용자 정의 매개변수 설정. 객체의 MD5 해시값을 매개변수로 하여 COS 서버에 입력'x-cos-meta-md5' : md5_str})print 'ETag: ' + response['ETag'] # Object의 Etag 값
#객체 다운로드response = client.get_object(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.Key='example-object-1' #다운로드한 객체의 Key 값)fp = response['Body'].get_raw_stream()download_object = fp.read() #객체 콘텐츠 획득print "get object body: " + download_objectprint 'ETag: ' + response['ETag']print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득
#다운로드한 객체의 MD5 해시값 계산md5 = hashlib.md5()md5.update(download_object)md5_str = md5.hexdigest()print 'download object md5: ' + md5_str#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증if md5_str == response['x-cos-meta-md5']:print 'MD5 check OK'else:print 'MD5 check FAIL'
OBJECT_PART_SIZE = 1024 * 1024 #각 멀티파트 크기 시뮬레이션OBJECT_TOTAL_SIZE = OBJECT_PART_SIZE * 1 + 123 #총 객체 크기object_body = '1' * OBJECT_TOTAL_SIZE #객체 콘텐츠#전체 객체 콘텐츠의 MD5 해시값 계산md5 = hashlib.md5()md5.update(object_body)md5_str = md5.hexdigest()
#멀티파트 업로드 초기화response = client.create_multipart_upload(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.Key='exampleobject-2', #업로드한 객체의 Key 값으로 대체StorageClass='STANDARD', #객체의 스토리지 레벨Metadata={'x-cos-meta-md5' : md5_str #사용자 정의 매개변수를 MD5 해시값으로 설정})#멀티파트 업로드한 UploadId 획득upload_id = response['UploadId']
#객체를 멀티파트 업로드할 때, 각 파트의 크기는 OBJECT_PART_SIZE이며, 마지막 파트의 크기는 OBJECT_PART_SIZE보다 작을 수 있습니다.part_list = list()position = 0left_size = OBJECT_TOTAL_SIZEpart_number = 0while left_size > 0:part_number += 1if left_size >= OBJECT_PART_SIZE:body = object_body[position:position+OBJECT_PART_SIZE]else:body = object_body[position:]position += OBJECT_PART_SIZEleft_size -= OBJECT_PART_SIZE#멀티파트 업로드response = client.upload_part(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.Key='exampleobject-2', #객체의 Key 값Body=body,PartNumber=part_number,UploadId=upload_id,EnableMD5=True #멀티파트 검사 활성화. COS 서버가 각 파트에 MD5 검사 실시.)etag = response['ETag'] #ETag는 각 파트의 MD5 값 표시part_list.append({'ETag' : etag, 'PartNumber' : part_number})print etag + ', ' + str(part_number)
#멀티파트 업로드 완료response = client.complete_multipart_upload(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시로 든 버킷이며, 1250000000은 예시 APPID.Key='exampleobject-2', #객체의 Key 값UploadId=upload_id,MultipartUpload={ #모든 파트의 ETag와 PartNumber가 모두 대응해야 함'Part' : part_list},)#ETag는 병합한 객체의 고유성을 검사하기 위한 고유 태그값으로, 객체 콘텐츠의 MD5 해시값이 아닙니다.print "ETag: " + response['ETag']print "Location: " + response['Location'] #URL 주소print "Key: " + response['Key']
# 객체 다운로드response = client.get_object(Bucket='examplebucket-1250000000', #사용자 Bucket 이름으로 대체. examplebucket은 예시 버킷이며, 1250000000은 예시 APPID임.Key='exampleobject-2' #객체의 Key 값)print 'ETag: ' + response['ETag'] #객체의 ETag는 객체 콘텐츠의 MD5 해시값이 아님print 'x-cos-meta-md5: ' + response['x-cos-meta-md5'] #사용자 정의 매개변수 x-cos-meta-md5 획득
#다운로드한 객체의 MD5 해시값 계산fp = response['Body'].get_raw_stream()DEFAULT_CHUNK_SIZE = 1024*1024md5 = hashlib.md5()chunk = fp.read(DEFAULT_CHUNK_SIZE)while chunk:md5.update(chunk)chunk = fp.read(DEFAULT_CHUNK_SIZE)md5_str = md5.hexdigest()print 'download object md5: ' + md5_str#다운로드한 객체의 MD5 해시값과 업로드된 객체의 MD5 해시값을 비교하여 객체 일치 여부 인증if md5_str == response['x-cos-meta-md5']:print 'MD5 check OK'else:print 'MD5 check FAIL'
피드백