使用分块将文件上传到 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. 要求

  • 一个浏览器,例如 ChromeFirefox
  • 已启用结算功能的 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 1(在 Google Cloud Platform 上安装 ABAP Platform Trial 1909 并安装 ABAP SDK for Google Cloud)和 Codelab 2(使用令牌为在 Compute Engine VM 上托管的 SAP 配置 ABAP SDK 身份验证),然后才能继续学习本 Codelab。
  • 如果您已完成 Codelab 1 和 Codelab 2,系统会为您预配 ABAP Platform Trial 1909 System on Google Cloud,以及身份验证和连接所需的设置。
  • 如果您尚未完成 Codelab 1 和 Codelab 2,则无法获得执行本 Codelab 中所述步骤所需的所有基础架构和连接。因此,您必须先完成 Codelab 1 和 Codelab 2,然后才能继续学习本 Codelab。

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 端进行配置。

对于与身份验证和连接相关的配置,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.png

1886be610c63ed6b.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,您可以直接在 SAP 系统中使用 ABAP 访问这些功能。

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 隐去个人身份信息
  • 从 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