OBS 對(duì)象上傳下載的一致性校驗(yàn)
1????? 方案概述
1.1????? 背景說明
OBS服務(wù)在提供各種對(duì)象上傳下載等服務(wù)時(shí),已經(jīng)為用戶提供了安全、高可靠的數(shù)據(jù)存儲(chǔ)能力,為確保傳輸和應(yīng)用過程中可能產(chǎn)生的數(shù)據(jù)一致性問題,OBS服務(wù)也為用戶提供了各種方式來校驗(yàn)對(duì)象的MD5一致性,本文就幾中常用的方式進(jìn)行介紹。
1.2????? 方案說明
OBS服務(wù)為用戶提供了不同工具/SDK使用場(chǎng)景下基于MD5校驗(yàn)數(shù)據(jù)一致性能力:
其中OBS Browser和obsutil工具,在開啟MD5校驗(yàn)功能后,進(jìn)行對(duì)象上傳時(shí),只有在OBS服務(wù)端上已上傳對(duì)象的MD5值與本地對(duì)象MD5值一致時(shí)才可以上傳成功,從而保證上傳數(shù)據(jù)的一致性,同時(shí)也將MD5值存放在了對(duì)象元數(shù)據(jù)中。在開啟MD5校驗(yàn)功能后進(jìn)行對(duì)象下載時(shí),OBS服務(wù)端會(huì)將存放在對(duì)象元數(shù)據(jù)中的MD5值與下載后的對(duì)象MD5值進(jìn)行比對(duì),只有兩者一致才能成功下載對(duì)象。如圖1所示。
圖1 OBS Browser和obsutil進(jìn)行對(duì)象上傳下載MD5校驗(yàn)流程
另一種方法是OBS SDK,它提供接口參數(shù),利用content-MD5頭域能力提供上傳數(shù)據(jù)一致性校驗(yàn)。上傳對(duì)象完成校驗(yàn)后,對(duì)象元數(shù)據(jù)中的etag值等同于MD5值,但當(dāng)對(duì)象為多段對(duì)象或加密對(duì)象時(shí),對(duì)象元數(shù)據(jù)中的etag值不是MD5值。在這種情況,MD5沒有對(duì)比值,OBS SDK也無法對(duì)下載對(duì)象操作進(jìn)行MD5校驗(yàn),但用戶可在上傳對(duì)象時(shí)將MD5值存入對(duì)象自定義元數(shù)據(jù)中,供下載對(duì)象時(shí)進(jìn)行MD5校驗(yàn),這部分內(nèi)容在3.3中會(huì)詳細(xì)講到。
2????? 對(duì)象上傳的校驗(yàn)操作指導(dǎo)
2.1????? 方式一:OBS Browser
步驟一:登錄OBS Browser后,單擊頁面右上角的“系統(tǒng)配置”圖標(biāo),在“系統(tǒng)配置>基本配置”窗口,勾選“啟用MD5校驗(yàn)”并保存設(shè)置,如圖2所示。
圖2 OBS Browser配置MD5校驗(yàn)
步驟二:選擇需要上傳的對(duì)象,單擊“確定”后,在頁面右上角單擊“任務(wù)管理”圖標(biāo),在“正在運(yùn)行”任務(wù)管理列表頁簽中查看對(duì)象上傳狀態(tài)和MD5校驗(yàn)狀態(tài),待對(duì)象上傳完成,可以在“已完成”任務(wù)管理列表頁簽中查看到MD5校驗(yàn)結(jié)果,如圖3所示。
圖3 OBS Browser查看MD5校驗(yàn)結(jié)果
說明:
·????????? 開啟MD5校驗(yàn)會(huì)影響上傳下載性能。
·????????? OBS Browser工具如何使用和下載,請(qǐng)參考對(duì)象存儲(chǔ)服務(wù)OBS幫助文檔(鏈接:https://support.huaweicloud.com/obs/index.html)。
2.2????? 方式二:obsutil
使用obsutil工具時(shí),可通過附加-vmd5參數(shù)來上傳對(duì)象,此時(shí)OBS服務(wù)端會(huì)幫用戶進(jìn)行MD5校驗(yàn),只有在OBS服務(wù)端上已上傳對(duì)象的MD5值與本地對(duì)象MD5值一致時(shí)才可以上傳成功,如圖4所示。
圖4 obsutil查看MD5校驗(yàn)結(jié)果
說明:
·????????? 開啟MD5校驗(yàn)會(huì)影響上傳下載性能。
·????????? obsutil工具如何使用和下載,請(qǐng)參考對(duì)象存儲(chǔ)服務(wù)OBS幫助文檔(鏈接:https://support.huaweicloud.com/obs/index.html)。
2.3????? 方式三:OBS SDK
除了上述兩種方法,您還可以基于華為云SDK,通過編寫代碼調(diào)用華為云API來校驗(yàn)對(duì)象上傳的一致性。如果不匹配則上傳失敗,返回HTTP 400錯(cuò)誤(Error Message: The Content-MD5 you specified did not match what we received.)
華為云有10種語言SDK可供選擇,下面列舉其中2種語言MD5校驗(yàn)。
2.3.1???? OBS Java SDK
您可以通過ObsClient.base64Md5來直接計(jì)算Content-MD5頭域,并使用ObjectMetadata.setContentMd5來設(shè)置對(duì)象MD5值。OBS服務(wù)端會(huì)將該Content-MD5頭域與對(duì)象數(shù)據(jù)計(jì)算出的經(jīng)過Base64編碼后MD5值進(jìn)行對(duì)比,示例代碼如下。
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 創(chuàng)建ObsClient實(shí)例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
// 計(jì)算并設(shè)置MD5值
ObjectMetadata metadata = new ObjectMetadata();
File file = new File("E:\README.txt");
FileInputStream fis = new FileInputStream(file);
InputStream is = (InputStream)fis;
String contentMd5 = obsClient.base64Md5(is);
metadata.setContentMd5(contentMd5);
// 帶MD5校驗(yàn)功能上傳文件
obsClient.putObject("bucketname", "objectkey", file, metadata);
說明:
·????????? 開啟MD5校驗(yàn)會(huì)影響上傳下載性能。
·????????? OBS SDK各工具如何使用和下載,請(qǐng)參考對(duì)象存儲(chǔ)服務(wù)OBS幫助文檔(鏈接:https://developer.huaweicloud.com/sdk?OBS)。
2.3.2???? OBS Python SDK
您可以通過PutObjectHeader.md5來設(shè)置對(duì)象Content-MD5頭域。其中GetFileMd5函數(shù)用于計(jì)算對(duì)象的MD5值(用戶可以自定義,僅供參考),示例代碼如下。
# 引入模塊
from obs import ObsClient
# 創(chuàng)建ObsClient實(shí)例
obsClient = ObsClient(
access_key_id='*** Provide your Access Key ***',
secret_access_key='*** Provide your Secret Key ***',
server='https://your-endpoint'
)
from obs import PutObjectHeader
headers = PutObjectHeader()
# 計(jì)算MD5
def GetFileMd5(filename):
if not os.path.isfile(filename):
return
myhash = hashlib.md5()
f = open(filename, 'rb')
str = f.read()
myhash.update(str)
f.close()
return myhash.digest()
# 帶MD5校驗(yàn)上傳文件
filename = ‘E:\README.txt’
contentMd5 = GetFileMd5(filename)
contentMd5B64 = base64.b64encode(contentMd5).decode()
headers.md5 = contentMd5B64
resp = obsClient.putFile('bucketname', 'objectkey', filename, headers=headers)
if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
說明:
·????????? 開啟MD5校驗(yàn)會(huì)影響上傳下載性能。
·????????? OBS SDK各工具如何使用和下載,請(qǐng)參考對(duì)象存儲(chǔ)服務(wù)OBS幫助文檔(鏈接:https://developer.huaweicloud.com/sdk?OBS)。
3????? 對(duì)象下載的校驗(yàn)操作指導(dǎo)
3.1????? 方式一:OBS Browser
步驟一:登錄OBS Browser后,單擊頁面右上角的“系統(tǒng)配置”圖標(biāo),在“系統(tǒng)配置>基本配置”窗口,勾選“啟用MD5校驗(yàn)”并保存設(shè)置,如圖5所示。
圖5 OBS Browser配置MD5校驗(yàn)
步驟二:選擇需要下載的文件,單擊“確定”后,在頁面右上角單擊“任務(wù)管理”圖標(biāo),在“正在運(yùn)行”任務(wù)管理列表頁簽中可以查看對(duì)象下載狀態(tài)和MD5校驗(yàn)狀態(tài),待對(duì)象下載完成,可以在“已完成”任務(wù)管理列表頁簽中查看到MD5校驗(yàn)結(jié)果,如圖6所示。
圖6 OBS Browser查看MD5校驗(yàn)結(jié)果
說明:
·????????? OBS Browser工具如果在上傳對(duì)象時(shí)未開啟MD5校驗(yàn)的功能,那在下載對(duì)象時(shí)即使開啟了MD5校驗(yàn)功能其實(shí)也沒有進(jìn)行MD5校驗(yàn)。
3.2????? 方式二:obsutil
使用obsutil工具時(shí),若通過附加-vmd5參數(shù)來上傳對(duì)象 ,此時(shí)OBS服務(wù)端會(huì)幫用戶進(jìn)行MD5校驗(yàn),同時(shí)還會(huì)把此MD5值存放在該對(duì)象的元數(shù)據(jù)中(如圖7所示),以便于下載的時(shí)候讀取該MD5值,與下載對(duì)象計(jì)算的MD5值進(jìn)行比較,如圖8所示。
圖7 存放在對(duì)象元數(shù)據(jù)中的MD5值
圖8 使用obsutil附加-vmd5參數(shù)來下載對(duì)象
說明:
·????????? OBS Browser工具如果在上傳對(duì)象時(shí)未開啟MD5校驗(yàn)的功能,那在下載對(duì)象時(shí)即使開啟了MD5校驗(yàn)功能其實(shí)也沒有進(jìn)行MD5校驗(yàn)。
3.3????? 方式三:OBS SDK
OBS服務(wù)SDK對(duì)上傳對(duì)象的Content-MD5頭域進(jìn)行一致性校驗(yàn),但未做下載對(duì)象的一致性校驗(yàn),但可以通過在上傳對(duì)象時(shí)把MD5值存放到對(duì)象自定義元數(shù)據(jù)里,對(duì)象下載后,將此自定義元數(shù)據(jù)里的MD5值與下載到本地的對(duì)象進(jìn)行校驗(yàn)比對(duì)。
華為云有10種語言SDK可供選擇,下面列舉其中2種。
3.3.1???? OBS Java SDK
在上傳對(duì)象時(shí)通過ObjectMetadata.addUserMetadata來存放對(duì)象Content-MD5頭域值。對(duì)象下載后,將此自定義元數(shù)據(jù)里的MD5校驗(yàn)值和下載到本地文件的MD5校驗(yàn)值進(jìn)行對(duì)比,示例代碼如下。
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 創(chuàng)建ObsClient實(shí)例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
// 把Content-MD5頭域值存放入對(duì)象自定義元數(shù)據(jù)中
ObjectMetadata metadata = new ObjectMetadata();
File file = new File("E:\\README.txt");
FileInputStream fis = new FileInputStream(file);
InputStream is = (InputStream)fis;
String contentMd5 = obsClient.base64Md5(is);
metadata.addUserMetadata("property1", contentMd5);
// 上傳文件
obsClient.putObject("bucketname", "objectkey", file, metadata);
// 獲取對(duì)象的自定義元數(shù)據(jù)
ObjectMetadata metadataDown = obsClient.getObjectMetadata("bucketname", "objectkey");
String contentMd5Origin = metadataDown.getUserMetadata("property1");
// 對(duì)下載后的對(duì)象進(jìn)行MD5值進(jìn)行比對(duì)
ObsObject obsObject = obsClient.getObject("chongchongbucket001", "cc.txt");
String contentMd5Download = obsClient.base64Md5(obsObject.getObjectContent());
if(contentMd5Origin.contentEquals(contentMd5Download))
System.out.println("Object MD5 validation passes!\n");
else
System.out.println("Object MD5 validation failed!\n");
3.3.2???? OBS Python SDK
在上傳對(duì)象時(shí)通過metadata參數(shù)來存放對(duì)象Content-MD5頭域值。對(duì)象下載后,將此自定義元數(shù)據(jù)里的Content-MD5頭域值與下載到本地的對(duì)象進(jìn)行校驗(yàn)比對(duì),示例代碼如下。
# 引入模塊
from obs import ObsClient
# 創(chuàng)建ObsClient實(shí)例
obsClient = ObsClient(
access_key_id='*** Provide your Access Key ***',
secret_access_key='*** Provide your Secret Key ***',
server='https://your-endpoint'
)
from obs import PutObjectHeader
headers = PutObjectHeader()
# MD5值計(jì)算函數(shù)
def GetFileMd5(filename):
if not os.path.isfile(filename):
return
myhash = hashlib.md5()
f = open(filename, 'rb')
str = f.read()
myhash.update(str)
f.close()
return myhash.digest()
# 把MD5值存放入對(duì)象自定義元數(shù)據(jù)中
filename = ‘E:\\README.txt’
contentMd5 = GetFileMd5(filename)
contentMd5B64 = base64.b64encode(contentMd5).decode()
metadata = {'property1' : 'contentMd5B64'}
resp = obsClient.putFile('bucketname', 'objectkey', filename, metadata=metadata)
if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
# 獲取對(duì)象自定義元數(shù)據(jù)中的MD5值
resp = obsClient.putFile('bucketname', 'objectkey')
contentMd5Origin = dict(resp.header).get('property1')
if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
# 對(duì)下載后的對(duì)象進(jìn)行MD5值進(jìn)行比對(duì)
filenameDown = "E:\\README_DOWN.txt"
resp = obsClient.putFile('bucketname', 'objectkey', downloadPath=filenameDown)
contentMd5Download = base64.b64encode(GetFileMd5(filenameDown)).decode()
if (contentMd5Origin == contentMd5Download):
print("Object MD5 validation passes!\n")
else:
print("Object MD5 validation failed!\n")
對(duì)象存儲(chǔ)服務(wù) OBS 存儲(chǔ)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。