ABAP读取FTP服务器文件

发布时间 2023-08-04 16:13:43作者: 鲸与海

一、参考Note2072995和Note1605054的说明,在SAP系统做以下2点调整

1、给SAP账号添加权限对象S_ADMI_FCD,并勾选SFTP选项

2、在表SAPFTP_SERVERS维护ftp服务器地址,建议直接输入*,可以参考使用SE16对数据库表进行编辑

 

二、代码

TYPES: BEGIN OF ty_ftp,
         line(255) TYPE c,
       END OF ty_ftp,
       BEGIN OF ty_bin,
         line(255) TYPE x,
       END OF ty_bin.

DATA: lt_ftp TYPE TABLE OF ty_ftp,
      ls_ftp TYPE ty_ftp,
      lt_bin TYPE TABLE OF ty_bin.

DATA: lv_server(255) TYPE c VALUE '192.168.xx.xx', "服务器地址
      lv_user(255)   TYPE c VALUE 'user',           "账号
      lv_pwd(255)    TYPE c VALUE 'xxxx',      "密码
      lv_dest        TYPE rfcdest VALUE 'SAPFTP',   "操作标识
      lv_handle      TYPE i,
      lv_len         TYPE i,
      lv_key         TYPE i VALUE 26101957,
      lv_cmd(255)    TYPE c,
      lv_dir(255)    TYPE c VALUE 'IQC/10000567973', "指定目录
      lv_dir_len     TYPE i,
      lv_bin_len     TYPE i,
      lv_xstr        TYPE xstring.

DATA: lv_msg TYPE string.

lv_len = strlen( lv_pwd ).

"密码加密
CALL FUNCTION 'HTTP_SCRAMBLE'
  EXPORTING
    source      = lv_pwd "原始密码
    sourcelen   = lv_len "密码长度
    key         = lv_key "加密方式
  IMPORTING
    destination = lv_pwd. "加密密码

"连接ftp服务器
CALL FUNCTION 'FTP_CONNECT'
  EXPORTING
    host            = lv_server
    user            = lv_user
    password        = lv_pwd
    rfc_destination = lv_dest
  IMPORTING
    handle          = lv_handle
  EXCEPTIONS
    OTHERS          = 1.

IF sy-subrc <> 0.
  "获取错误
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid               = sy-msgid
      msgnr               = sy-msgno
      msgv1               = sy-msgv1
      msgv2               = sy-msgv2
      msgv3               = sy-msgv3
      msgv4               = sy-msgv4
    IMPORTING
      message_text_output = lv_msg.

  WRITE lv_msg.
ELSE.

  "执行CMD命令(列出指定文件夹下所有的文件)
  CONCATENATE 'nlist' lv_dir INTO lv_cmd SEPARATED BY space.

  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle  = lv_handle
      command = lv_cmd
    TABLES
      data    = lt_ftp
    EXCEPTIONS
      OTHERS  = 2.

  "指定目录的长度
  lv_dir_len = strlen( lv_dir ).

  LOOP AT lt_ftp INTO ls_ftp.
    "文件的路径等于指定目录
    IF ls_ftp-line+0(lv_dir_len) = lv_dir.
      "读取文件
      CALL FUNCTION 'FTP_SERVER_TO_R3'
        EXPORTING
          handle        = lv_handle
          fname         = ls_ftp-line
        IMPORTING
          blob_length   = lv_bin_len
        TABLES
          blob          = lt_bin
        EXCEPTIONS
          tcpip_error   = 1
          command_error = 2
          data_error    = 3
          OTHERS        = 4.

      "二进制转XString
      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_bin_len
        IMPORTING
          buffer       = lv_xstr
        TABLES
          binary_tab   = lt_bin
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.

      "将xstring内容调用外部系统文件上传http接口

    ENDIF.
  ENDLOOP.

  "关闭连接
  CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = lv_handle
    EXCEPTIONS
      OTHERS = 4.

  cl_demo_output=>write( lt_ftp ).
  cl_demo_output=>display(  ).

ENDIF.

这里有FTP相关的CMD指令(可自行百度用法)