使用分块将文件上传到 Cloud Storage

1. 简介

在此 Codelab 中,我们列出了创建服务账号并使用该账号配置 ABAP SDK for Google Cloud 提供的客户端密钥和通信映射表的步骤,以及在 ABAP 中调用 Cloud Storage JSON API 的步骤。

此 Codelab 中使用了以下 Google Cloud 服务:

  • Compute Engine
  • 网络服务
  • Cloud Shell
  • Cloud Storage JSON API V1

注意:创建新的 Google Cloud 项目时,系统会自动启用一组特定的 API 和服务,包括 Cloud Storage。这样可确保您能立即利用这一强大的存储解决方案。因此,您无需将其作为额外步骤启用。

前提条件

构建内容

您将使用 ABAP SDK for Google Cloud 在 SAP 系统中创建以下程序

  • 创建 Cloud Storage 存储桶。
  • 从应用服务器读取文件,并将其上传到创建的 Cloud Storage 存储桶。

2. 要求

  • 一个浏览器,例如 Chrome 或 Firefox。
  • 已启用结算功能的 Google Cloud 项目,或创建 Google Cloud Platform 90 天免费试用账号。
  • 您的系统中已安装 SAP GUI(Windows 或 Java)。如果您的笔记本电脑上已安装 SAP GUI,请使用虚拟机的外部 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 系统。
  • 在继续学习本 Codelab 之前,您必须先完成 Codelab 1(在 Google Cloud Platform 上安装 ABAP 平台试用版 1909 并安装 ABAP SDK for Google Cloud)和 Codelab 2(使用令牌为托管在 Compute Engine 虚拟机上的 SAP 配置 ABAP SDK 身份验证)。
  • 如果您已完成 Codelab 1 和 Codelab 2,那么您应该已在 Google Cloud 上预配了 ABAP 平台试用版 1909 系统,并完成了身份验证和连接所需的设置。
  • 如果您尚未完成 Codelab 1 和 Codelab 2,则不具备执行本 Codelab 中提供的步骤所需的所有基础设施和连接。因此,您必须先完成 Codelab 1 和 Codelab 2,然后才能继续学习本 Codelab。

4. 创建具有 Storage Object User 角色的服务账号

如需创建具有所需角色的服务账号,请执行以下步骤:

  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 参考 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

在下一个弹出式窗口中,根据您的选择,选择“本地对象”或“提供软件包名称”。

  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 报告以从应用服务器读取文件并将其上传到 Cloud Storage 存储桶

在执行此活动之前,您需要准备一个大型文本文件。在此示例中,我们已创建了一个大型文本文件并将其上传到应用服务器。您可以使用事务代码 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 存储桶,验证文件是否已成功上传

90678b475e165adf.png1886be610c63ed6b.png

8. 使用 ABAP SDK 代码将文件上传到 Cloud Storage(附代码说明)

从本质上讲,此 ABAP 程序与 Google Cloud Storage 集成。它从应用服务器读取文件,并将文件数据传递给 Storage API 的 API 客户端桩,以便将文件上传到之前报告程序中创建的存储桶。

您创建的用于上传文件的报告程序会执行以下操作:

分步细分

建立联系:

  • 它使用 /GOOG/CL_STORAGE_V1 类与 Google Storage 服务建立 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:必须将文件上传到的存储桶名称
  • IS_DATA:需要上传的文件数据
  • IV_CONTENT_TYPE:文件的内容类型,在当前场景中,我们上传的是文本文件,因此使用“text/plain”。

请注意,我们不会向导入参数 IV_CHUNK_SIZE 传递任何值,而是让 API 客户端桩使用与此参数关联的默认值(即 8 MB)。

处理成功/错误情况:

  • 根据 API 调用是否成功显示 API 响应。

关闭连接:

  • 关闭与存储服务的 HTTP 连接。

9. 恭喜

恭喜!您已成功完成“将文件上传到 Cloud Storage 存储桶”Codelab。

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 可与各种应用和平台搭配使用。

您现在可以继续学习以下 Codelab,继续了解如何使用 ABAP SDK 访问各种 Google Cloud 服务。

  • 向 Pub/Sub 发送事件
  • 接收来自 Cloud Pub/Sub 的事件
  • 使用 Cloud Translation API 翻译文本
  • 使用 DLP API 进行 PII 密文处理
  • 从 ABAP 调用 BigQuery ML

10. 清理

如果您不想继续学习与 ABAP SDK for Google Cloud 相关的其他 Codelab,请继续执行清理操作。

删除项目

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