OBS 對(duì)象上傳下載的一致性校驗(yàn)

      網(wǎng)友投稿 1810 2022-05-30

      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)

      OBS 對(duì)象上傳下載的一致性校驗(yàn)

      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)容。

      上一篇:節(jié)點(diǎn)互信建立、及修復(fù)
      下一篇:如何寫出讓同事無法維護(hù)的代碼?
      相關(guān)文章
      亚洲国产精品va在线播放| 中文字幕亚洲精品无码| 亚洲国产成人手机在线观看| 亚洲人成免费电影| 99久久精品国产亚洲| 亚洲综合精品香蕉久久网97| 亚洲毛片在线观看| 日产亚洲一区二区三区| 亚洲黄色片免费看| 亚洲美女大bbbbbbbbb| 亚洲精品视频免费在线观看| 亚洲欧洲国产综合| 亚洲午夜国产精品无卡| 亚洲综合校园春色| 亚洲色成人网站WWW永久四虎 | 国产亚洲婷婷香蕉久久精品 | 亚洲av片不卡无码久久| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲日本乱码卡2卡3卡新区| 亚洲日韩一中文字暮| 色欲aⅴ亚洲情无码AV| 亚洲综合色在线观看亚洲| 亚洲真人无码永久在线| 久久精品国产亚洲av麻豆| 亚洲综合婷婷久久| 亚洲国产成人久久精品app| 精品久久亚洲中文无码| 亚洲色少妇熟女11p| 337p日本欧洲亚洲大胆人人| 亚洲一区二区三区无码影院| 亚洲精品无码不卡在线播放HE| 亚洲成人动漫在线| 亚洲人成电影网站| 亚洲人成人网站18禁| 国产亚洲综合一区二区三区| 国产亚洲精品影视在线产品| 亚洲产国偷V产偷V自拍色戒| 亚洲麻豆精品果冻传媒| 久久亚洲最大成人网4438| 亚洲AV无码专区在线观看成人|