將含有分塊的檔案上傳至 Cloud Storage

1. 簡介

在本程式碼研究室中,我們列出了建立服務帳戶的步驟,並使用該帳戶設定 ABAP SDK for Google Cloud 提供的用戶端金鑰和通訊對照表,以及在 ABAP 中叫用 Cloud Storage JSON API。

本程式碼研究室會使用下列 Google Cloud 服務:

  • Compute Engine
  • 網路服務
  • Cloud Shell
  • Cloud Storage JSON API 1.0 版

注意:建立新的 Google Cloud 專案時,系統會自動啟用特定的 API 和服務,包括 Cloud Storage。這樣一來,您就能立即享有這項強大的儲存空間解決方案。因此,您不需要額外採取任何步驟來啟用這項功能。

必要條件

建構項目

您將使用 Google Cloud 的 ABAP SDK 在 SAP 系統中建立下列程式

  • 建立 Cloud Storage 值區。
  • 從應用程式伺服器讀取檔案,然後上傳至已建立的 Cloud Storage 值區。

2. 需求條件

  • ChromeFirefox 等瀏覽器。
  • 已啟用計費功能的 Google Cloud 專案,或為 Google Cloud Platform 建立 90 天免費試用帳戶
  • 系統中安裝了 SAP GUI (Windows 或 Java)。如果筆電上已安裝 SAP GUI,請使用 VM 外部 IP 位址做為應用程式伺服器 IP,連線至 SAP。如果您使用 Mac,也可以安裝 這個連結中的 SAP GUI for Java。

3. 事前準備

6757b2fb50ddcc2d.png

  • 執行下列指令,即可驗證帳戶,並將預設專案設為 abap-sdk-poc。以區域 us-west4-b 為例。如有需要,請根據偏好變更下列指令中的專案和區域。
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • 您必須能存取已安裝 Google Cloud 專用 ABAP SDK 的 SAP 系統。
  • 您必須先完成 Codelab 1 (在 Google Cloud Platform 上安裝 ABAP 平台試用版 1909,並安裝 Google Cloud 專用的 ABAP SDK) 和 Codelab 2 (使用 Compute Engine VM 代管的 SAP 代幣設定 ABAP SDK 驗證),才能繼續進行本 Codelab。
  • 如果您已完成程式碼研究室 1 和程式碼研究室 2,Google Cloud 上就會為您佈建 ABAP 平台試用版 1909 系統,並完成驗證和連線功能的必要設定。
  • 如果您尚未完成程式碼研究室 1 和程式碼研究室 2,就無法取得執行本程式碼研究室中提供步驟所需的所有基礎架構和連線。因此,您必須先完成程式碼研究室 1 和程式碼研究室 2,才能繼續進行本程式碼研究室。

4. 建立具有儲存空間物件使用者角色的服務帳戶

如要建立具備必要角色的服務帳戶,請執行下列步驟:

  1. 在 Cloud Shell 終端機中執行下列指令:
gcloud iam service-accounts create abap-sdk-storage-tester \
--display-name="Service Account for Cloud Storage"
  1. 接著,請在上述步驟中建立的服務帳戶中新增必要角色:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/storage.objectUser'

上述指令會使用 abap-sdk-poc 做為 Google Cloud 專案的預留位置。將 abap-sdk-poc 替換為您的專案 ID。

  1. 如要確認是否已新增角色,請前往 IAM 頁面。您建立的服務帳戶應會列出已指派給該帳戶的角色,如下所示:

92d75ce1554efb69.png

5. 建立用戶端金鑰設定

您已在 Google Cloud 端設定必要條件,現在可以繼續進行 SAP 端的設定。

針對驗證和連線相關設定,Google Cloud 適用的 ABAP SDK 會使用 /GOOG/CLIENT_KEY 資料表

如要維護 /GOOG/CLIENT_KEY 表格中的設定,請執行下列步驟:

  1. 在 SAP GUI 中輸入交易代碼 SPRO
  2. 按一下「SAP Reference IMG」
  3. 依序按一下「ABAP SDK for Google Cloud」>「基本設定」>「設定用戶端金鑰」
  4. 請針對下列欄位保留以下值:

欄位

Google Cloud 金鑰名稱

TEST_STORAGE

Google Cloud 服務帳戶名稱

abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud 範圍

https://www.googleapis.com/auth/cloud-platform

專案 ID

abap-sdk-poc

授權類別

/GOOG/CL_AUTH_GOOGLE

將所有其他欄位留空

6. 建立 Z 報表,以便在 Cloud Storage 中建立值區

  1. 登入 SAP 系統。
  2. 前往交易代碼 SE38,然後建立名為 ZDEMO_CREATE_BUCKET. 的報表程式
  3. 在隨即開啟的彈出式視窗中,提供下列詳細資料:

93f3edb7bbb5c3c4.png

在下一個彈出式視窗中,選取「Local Object」或「Provide a package name」即可。

  1. 在 ABAP 編輯器中新增下列程式碼:
DATA lv_json_response TYPE string.
DATA ls_input         TYPE /goog/cl_storage_v1=>ty_001.
DATA lo_storage       TYPE REF TO /goog/cl_storage_v1.

TRY.

    lo_storage = NEW #( iv_key_name = 'TEST_STORAGE' ).
        
        " Bucket Name should be globally unique & permanent
    ls_input = VALUE #( name = 'newtest_bucket_abapsdk_gcloud001' ).  
    lo_storage->insert_buckets
                ( EXPORTING iv_q_project = CONV #( lo_storage->gv_project_id )
                    is_input     = ls_input
          IMPORTING es_raw       = lv_json_response
                    es_output    = DATA(ls_output)
                    ev_ret_code  = DATA(lv_ret_code)
                    ev_err_text  = DATA(lv_err_text)
                    es_err_resp  = DATA(ls_err_resp) ).

    IF lo_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket was created:'
        )->next_section( 'JSON Response:'
        )->write_json( lv_json_response
        )->display( ).

    ELSE.
      DATA(lv_msg) = lv_ret_code && ':' && lv_err_text.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket creation failed;'
        )->next_section( 'Error:'
        )->write_json( lv_msg
        )->display( ).
    ENDIF.

  CATCH /goog/cx_sdk INTO DATA(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
 

請注意,如果值區名稱在全域範圍內重複,系統就不會建立值區,因此請在執行程式碼前,為值區使用不重複的名稱

  1. 儲存並啟用報表。
  2. 執行報表 (按下 F8)。

執行成功後,您應該會看到下列報表輸出內容:

ff232fba9a4178fb.png

7. 建立 Z-Report,從應用程式伺服器讀取檔案並上傳至 Cloud Storage 值區

執行這項活動前,請先準備大型文字檔案。我們已建立大型文字檔並上傳至應用程式伺服器。您可以使用交易代碼 CG3Z,將檔案上傳至 SAP 系統的應用程式伺服器

在本例中,我們使用大小約 40 MB 的文字檔,該檔案已上傳至 /tmp 目錄中的應用程式伺服器。

您也可以使用以下連結,從 GitHub 下載這個資料夾:範例檔案

  1. 登入 SAP 系統
  2. 前往交易代碼 SE38,然後建立名為 ZDEMO_UPLOAD_FILE. 的報表程式
  3. 在隨即開啟的彈出式視窗中,提供下列詳細資料:

19cbe6987bba58e4.png

在下一個彈出式視窗中,選取「Local Object」或「Provide a package name」即可。

  1. 在 ABAP 編輯器中新增下列程式碼:
DATA lv_file_length TYPE i.
DATA lv_msg         TYPE string.
DATA lv_dset        TYPE string.
DATA lv_data        TYPE string.
DATA ls_data        TYPE xstring.
DATA lo_storage     TYPE REF TO /goog/cl_storage_v1.

" Read file data from the application server
DATA(dset) = '/tmp/sample_file.txt'.
OPEN DATASET dset FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
  MESSAGE 'Cannot opening/reading dataset' TYPE 'E'.
ENDIF.
DO.
  READ DATASET dset INTO lv_dset.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  CONCATENATE lv_data lv_dset INTO lv_data SEPARATED BY cl_abap_char_utilities=>newline.
  CLEAR lv_dset.

ENDDO.

CLOSE DATASET dset.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING  text   = lv_data
  IMPORTING  buffer = ls_data
  EXCEPTIONS failed = 1
             OTHERS = 2.
IF sy-subrc <> 0.
  MESSAGE 'Conversion from string to xstring failed' TYPE 'E'.
ENDIF.

TRY.

    lo_storage = NEW #( iv_key_name = 'DEMO_STORAGE' ).

    lo_storage->add_common_qparam( iv_name = 'uploadType' iv_value = 'resumable' ).

    lo_storage->insert_objects( EXPORTING iv_q_name       = 'large_text_file_demo.txt'
                                          iv_p_bucket     = 'newtest_bucket_abapsdk_gcloud001'
                                          is_data         = ls_data
                                          iv_content_type = 'text/pdf'
                                IMPORTING es_output       = data(ls_output)
                                          ev_ret_code     = data(lv_ret_code)
                                          ev_err_text     = data(lv_err_text)
                                          es_err_resp     = data(ls_err_resp) ).

    IF lo_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Object was uploaded successfully'
        )->write_text( 'Object Self Link:'
        )->write_text( ls_output-self_link
        )->display( ).
    ELSE.
      cl_demo_output=>new(
        )->begin_section( 'Error:'
        )->write_text( lv_msg
        )->display( ).
    ENDIF.
  CATCH /goog/cx_sdk INTO data(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.

lo_storage->close( ).
  1. 儲存並啟用報表。
  2. 執行報表 (按下 F8)。

執行成功後,您應該會看到下列報表輸出內容:

c982bfcd07d7e487.png

如要確認檔案是否已成功上傳,請按照下列步驟前往 Cloud Storage 值區

90678b475e165adf.png

1886be610c63ed6b.png

8. 使用 ABAP SDK 程式碼將檔案上傳至 Cloud Storage 的說明

這個 ABAP 程式本質上已與 Google Cloud Storage 整合。它會從應用程式伺服器讀取檔案,並將檔案資料傳遞至 Storage API 的 API 用戶端 Stub,以便將檔案上傳至先前建立的報告程式。

您建立用於上傳檔案的報表程式會執行以下操作:

逐步分析

建立連線:

  • 它會使用 /GOOG/CL_STORAGE_V1 類別,建立與 Google 儲存空間服務的 HTTP 連線。

Read File Data

  • 透過執行 OPEN DATASET 讀取應用程式伺服器上的檔案,然後呼叫標準 SAP 函式模組 SCMS_STRING_TO_XSTRING 來轉換為 XSTRING 格式。

新增常見的查詢參數

  • 為了達到分割上傳,我們需要選擇「可繼續上傳」上傳類型。根據預設,選取可續傳上傳功能時,檔案資料會分割成 8 MB 的區塊上傳。不過,開發人員可以設定參數 IV_P_CHUNK_SIZE 來變更這項分割大小,但建議使用預設設定。
  • 為讓 API 方法知道必須選擇「可繼續」上傳選項,我們會呼叫 ADD_COMMON_QPARAM 方法,並將 uploadType 傳遞為 resumable.

插入物件

  • 將下列參數傳遞給方法 INSERT_OBJECTS,以便呼叫該方法:
  • IV_Q_NAME:檔案名稱,用於將內容儲存在 Cloud Storage 中
  • IV_P_BUCKET:檔案上傳的值區名稱
  • IS_DATA:需要上傳的檔案資料
  • IV_CONTENT_TYPE:檔案的內容類型。在目前的情況下,我們上傳的是文字檔案,因此使用「text/plain」。

請注意,我們不會將任何值傳遞至匯入參數 IV_CHUNK_SIZE,而是讓 API 用戶端 Stub 使用與此參數相關聯的預設值,也就是 8 MB。

處理成功/錯誤:

  • 根據 API 呼叫是否成功,顯示 API 回應。

關閉連線:

  • 關閉與儲存空間服務的 HTTP 連線。

9. 恭喜

恭喜!您已成功完成「將檔案上傳至 Cloud Storage 值區」程式碼研究室。

Cloud Storage JSON API 提供多項功能,而 Google Cloud 適用的 ABAP SDK 可讓您直接在 SAP 系統中使用 ABAP 存取這些功能。

Google Cloud Storage 是儲存及管理大量資料的絕佳選擇。許多商家、企業和應用程式都會使用這個 API。

使用 Google Cloud Storage 的好處:

  • 成本效益:Google Cloud Storage 是儲存及管理大量資料的經濟實惠方式。
  • 簡易性:Google Cloud Storage 提供簡單易用的 API,使用者可輕鬆操作。
  • 彈性:Google Cloud Storage 可搭配各種應用程式和平台使用。

您現在可以繼續進行下列程式碼研究室,繼續學習如何使用 ABAP SDK 存取各種 Google Cloud 服務。

  • 將事件傳送至 Pub/Sub
  • 接收 Cloud Pub/Sub 傳送的事件
  • 使用 Cloud Translation API 翻譯文字
  • 使用 DLP API 遮蓋個人識別資訊
  • 從 ABAP 呼叫 BigQuery ML

10. 清理

如果您不想繼續進行與 Google Cloud 適用的 ABAP SDK 相關的其他程式碼研究室,請繼續進行清理作業。

刪除專案

  • 刪除 Google Cloud 專案:
gcloud projects delete abap-sdk-poc

刪除個別資源

  1. 刪除運算執行個體:
gcloud compute instances delete abap-trial-docker
  1. 刪除防火牆規則:
gcloud compute firewall-rules delete sapmachine
  1. 刪除服務帳戶:
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com