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

1. 簡介

在本程式碼實驗室中,我們列出建立服務帳戶的步驟,並說明如何使用該帳戶設定 ABAP SDK for Google Cloud 提供的用戶端金鑰和通訊地圖表格,以及在 ABAP 中叫用 Cloud Storage JSON API。

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

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

注意:建立新的 Google Cloud 專案時,系統會自動啟用特定 API 和服務,包括 Cloud Storage。確保您能立即使用這項強大的儲存空間解決方案。因此您不必額外啟用這項功能。

必要條件

建構項目

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

  • 建立 Cloud Storage bucket。
  • 從應用程式伺服器讀取檔案,並上傳至建立的 Cloud Storage Bucket。

2. 需求條件

  • 瀏覽器,例如 Chrome 或 Firefox。
  • 啟用計費功能的 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
  • 您必須有權存取已安裝 ABAP SDK for Google Cloud 的 SAP 系統。
  • 請先完成程式碼實驗室 1 (在 Google Cloud Platform 上安裝 ABAP Platform Trial 1909,並安裝 ABAP SDK for Google Cloud) 和程式碼實驗室 2 (使用權杖設定 ABAP SDK 驗證機制,適用於 Compute Engine VM 託管的 SAP),再繼續進行本程式碼實驗室。
  • 如果您已完成程式碼實驗室 1 和程式碼實驗室 2,應該已在 Google Cloud 上佈建 ABAP Platform Trial 1909 系統,並完成驗證和連線的必要設定。
  • 如果您尚未完成程式碼研究室 1 和 2,就無法具備所有必要基礎架構和連線,因此無法執行本程式碼研究室提供的步驟。因此,您必須先完成程式碼研究室 1 和 2,才能繼續進行本程式碼研究室。

4. 建立具有「Storage 物件使用者」角色的服務帳戶

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

  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 端的設定。

如要進行驗證和連線相關設定,ABAP SDK for Google Cloud 會使用 /GOOG/CLIENT_KEY 資料表

如要在 /GOOG/CLIENT_KEY 資料表中維護設定,請按照下列步驟操作:

  1. 在 SAP GUI 中輸入交易代碼 SPRO。
  2. 按一下「SAP Reference IMG」。
  3. 依序點選「ABAP SDK for Google Cloud」>「Basic Settings」>「Configure Client Key」。
  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 上建立 bucket

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

93f3edb7bbb5c3c4.png

在下一個彈出式視窗中,視需要選取「本機物件」或提供套件名稱。

  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.
 

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

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

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

ff232fba9a4178fb.png

7. 建立 Z 報表,從應用程式伺服器讀取檔案,並上傳至 Cloud Storage bucket

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

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

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

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

19cbe6987bba58e4.png

在下一個彈出式視窗中,視需要選取「本機物件」或提供套件名稱。

  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 Bucket

90678b475e165adf.png1886be610c63ed6b.png

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

基本上,這個 ABAP 程式會與 Google Cloud Storage 整合。這個函式會從應用程式伺服器讀取檔案,並將檔案資料傳遞至 Storage API 的 API 用戶端虛設常式,以便上傳至先前在報告程式中建立的儲存空間 bucket。

您建立的報表程式會執行下列操作來上傳檔案:

逐步解析

建立連線:

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

讀取檔案資料

  • 透過 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:檔案上傳至的 Bucket 名稱
  • IS_DATA:需要上傳的檔案資料
  • IV_CONTENT_TYPE:檔案的內容類型。在目前的情境中,我們上傳的是文字檔,因此使用「text/plain」。

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

處理成功/錯誤:

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

關閉連線:

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

9. 恭喜

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

Cloud Storage JSON API 具有許多功能,透過 ABAP SDK for Google Cloud,您可以使用 ABAP 在 SAP 系統中直接存取這些功能。

Google Cloud Storage 是儲存及管理大量資料的絕佳選擇。適用於各種商家、企業和應用程式。

使用 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 遮蓋 PII
  • 從 ABAP 呼叫 BigQuery ML

10. 清理

如不想繼續進行與 ABAP SDK for Google Cloud 相關的額外程式碼研究室,請繼續進行清理作業。

刪除專案

  • 刪除 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