ABAP】发送文件至企业微信机器人(EXCLE)

 

外部传输内表内容,转换成EXLCE文件流至企业微信机器人,并获取MEDIA_ID。

IV_KEY为企微机器人KEY,

IV_FIELD_NAME为定义的文件名

https://blog.csdn.net/weixin_65625611/article/details/128204931

 

复制代码
REPORT ZTEST666.


DATA:
  lo_http_client          TYPE REF TO if_http_client,
  lv_service              TYPE string,
  lv_result_string        TYPE string,
  lv_len                  TYPE i,
  lv_msg                  TYPE string,
  lv_message              TYPE string,
  lv_http_method          TYPE string,
  lv_string               TYPE string,
  lv_xstring              TYPE xstring,
  lv_media_id             TYPE string,
  lv_head_field           TYPE string,
  lo_entity               TYPE REF TO if_http_entity,
  lv_name                 TYPE string,
  lv_filename             TYPE string,
  lv_field_symbols_string TYPE string,
  lo_respone_data         TYPE REF TO data,
  part                    TYPE REF TO if_http_entity,
  lv_fielname_length      TYPE i.


DATA: lr_result_data TYPE REF TO data,
      lr_data_line   TYPE REF TO data.
DATA: lo_excel_export_service    TYPE REF TO cl_salv_export_tool_xls,
      lo_salv_export_column_conf TYPE REF TO if_salv_export_column_conf,
      lo_configuration           TYPE REF TO if_salv_export_configuration.
DATA: lv_content   TYPE cl_salv_export_tool_xls=>y_file_content,
      lv_mime_type TYPE cl_salv_export_tool_xls=>y_mime_type,

      lt_infos     TYPE cl_salv_export_tool_xls=>yt_msg,    "#EC NEEDED
      lt_warnings  TYPE cl_salv_export_tool_xls=>yt_msg.    "#EC NEEDED
DATA: lo_table_rtti    TYPE REF TO cl_abap_tabledescr,
      lt_dfies         TYPE ddfields,
      ls_dfies         TYPE dfies,
      lo_field_catalog TYPE REF TO cl_abap_structdescr.
DATA: lv_fieldname    TYPE string,
      lt_fieldcat     TYPE lvc_t_fcat,
      ls_fieldcat     TYPE lvc_s_fcat,
      lv_headtext     TYPE string,
      lv_bin_filesize TYPE i,
      lt_data_tab     TYPE TABLE OF solisti1.


DATA:iv_key TYPE  STRING VALUE 'f5aae1cb-fa8e-4166-8cb5-32be27bb933d'.
DATA:iv_field_name TYPE  STRING VALUE '888.XLSX'.

DATA:itab TYPE TABLE OF ZPPT001.
SELECT * INTO TABLE itab[] FROM ZPPT001.

DATA: lref_string TYPE REF TO cl_abap_datadescr,
      lref_data   TYPE REF TO data,
      lt_column   TYPE if_fdt_doc_spreadsheet=>t_column,
      ls_column   TYPE LINE OF if_fdt_doc_spreadsheet=>t_column.
DATA:
  lr_tabdescr TYPE REF TO cl_abap_structdescr,
  lr_data     TYPE REF TO data.

DATA:
      lv_lengcth  TYPE i,
      lv_index    TYPE i,
      lt_bin_data TYPE TABLE OF solisti1.

DATA: ls_fieldcat_input TYPE lvc_s_fcat.

* Field symbols declaration
FIELD-SYMBOLS: <fs_contents> TYPE STANDARD TABLE,
               <fs_line>     TYPE any,
               <fs_field>    TYPE any.

CREATE DATA lr_data LIKE LINE OF itab.
ASSIGN lr_data->* TO <fs_line>.

* Create data object
CREATE DATA lref_data LIKE itab.

* Assign download contents to field symbol
ASSIGN lref_data->* TO <fs_contents>.
<fs_contents> = itab[].

" 字段清单
lr_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ).
lt_dfies = cl_salv_data_descr=>read_structdescr( lr_tabdescr ).
LOOP AT lt_dfies INTO ls_dfies.
  lv_index = sy-tabix.
  CLEAR ls_fieldcat.
  READ TABLE lt_fieldcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname.
  ASSIGN COMPONENT ls_dfies-fieldname OF STRUCTURE <fs_line> TO <fs_field>.
  IF sy-subrc = 0.
    lref_string ?= cl_abap_datadescr=>describe_by_data( <fs_field> ).
*     Prepare structure for header text
    ls_column-id           = lv_index.
    ls_column-name         = ls_dfies-fieldname.
    IF ls_fieldcat-coltext IS NOT INITIAL.
      ls_column-display_name = ls_fieldcat-coltext.
    ELSE.
      ls_column-display_name = ls_dfies-scrtext_l.
    ENDIF.
*        ls_column-is_result    = abap_true.
    ls_column-type         = lref_string.
*     Append structure prepared to internal table
    APPEND ls_column TO lt_column.
  ENDIF.
ENDLOOP.
* Call class method to convert data to be downloaded to .xlsx compatible xstring
cl_fdt_xl_spreadsheet=>if_fdt_doc_spreadsheet~create_document(
      EXPORTING
        itab         = lref_data
        iv_call_type = 1
        columns      = lt_column
      RECEIVING
        xdocument    = lv_xstring ).

lv_service = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=' && iv_key && '&type=file'.

CALL METHOD cl_http_client=>create_by_url
  EXPORTING
    url                = lv_service
  IMPORTING
    client             = lo_http_client
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3.

CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

CALL METHOD lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).

CALL METHOD lo_http_client->request->if_http_entity~set_content_type(
  EXPORTING
    content_type = 'multipart/form-data' ).

CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
  EXPORTING
    formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.

part = lo_http_client->request->if_http_entity~add_multipart( ).

lv_filename = iv_field_name.
lv_fielname_length = strlen( lv_filename ).

lv_head_field = 'form-data; name="media";filename="' && lv_filename && '"; filelength=' && lv_fielname_length .
CALL METHOD part->set_header_field
  EXPORTING
    name  = 'Content-Disposition'
    value = lv_head_field.
*  lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
CALL METHOD part->set_content_type
  EXPORTING
    content_type = 'application/octet-stream; charset=utf-8'.
lv_len = xstrlen( lv_xstring ).

CALL METHOD part->set_data
  EXPORTING
    data   = lv_xstring
    offset = 0
    length = lv_len.

*FIELD-SYMBOL:<fs_media_id> TYPE ANY.
FIELD-SYMBOLS <fs_media_id> TYPE any.

TYPES:BEGIN OF TY_U,
  errcode TYPE  STRING,
  errmsg TYPE  STRING,
  type TYPE  STRING,
  media_id TYPE STRING,
  created_at TYPE STRING,
  END OF TY_U.
DATA:LS_U TYPE TY_U.
DATA:LT_U TYPE TY_U.

CALL METHOD lo_http_client->send
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3
    OTHERS                     = 4.

"读取远程服务返回的处理过结果。
CALL METHOD lo_http_client->receive
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.
IF sy-subrc <> 0 .
  lo_http_client->get_last_error( IMPORTING message = lv_message ).
*    zmesg-message = lv_message.
*    zmesg-type = 'E'.
*    APPEND zmesg.
  RETURN.
ELSE.
  lv_result_string = lo_http_client->response->get_cdata( ).

  ZCL_JSON=>deserialize( EXPORTING json = lv_result_string pretty_name = ZCL_JSON=>pretty_mode-camel_case CHANGING data = LS_U ).
*READ TABLE LT_U INTO LS_U INDEX 1.
*  lo_respone_data = ZCL_UI2_CL_JSON=>generate( json = lv_result_string ).
  IF LS_U IS NOT INITIAL.
*    lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'.
*    ASSIGN (lv_field_symbols_string) TO <fs_media_id>.


*    IF <fs_media_id> IS ASSIGNED.
*     ev_media_id = <fs_media_id>.
    PERFORM http_post USING LS_U-MEDIA_ID.
*        zmesg-type = 'S'.
*        zmesg-message = TEXT-s04 && ev_media_id .
*        APPEND zmesg.
*    ELSE.
*        zmesg-type = 'E'.
*        zmesg-message = lv_result_string .
*        APPEND zmesg.
*    ENDIF.
  ELSE.
*      zmesg-type = 'E'.
*      zmesg-message = lv_result_string .
*      APPEND zmesg.
  ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*&      Form  HTTP_POST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_EV_MEDIA_ID  text
*----------------------------------------------------------------------*
FORM HTTP_POST  USING    p_ev_media_id.
  DATA:lv_json_str TYPE  string.
  DATA: lv_url TYPE string.     "http 服务接口地址
  DATA: lo_http_client  TYPE REF TO if_http_client.
  DATA: lv_len TYPE i."发送报文长度
  DATA: lv_resp TYPE string.

  DATA: lv_message  TYPE string.
  DATA: lv_mtype    TYPE bapi_mtype.
  DATA: lv_code     TYPE sysubrc.

  DATA:ls_data TYPE zttmesg.

  " 设置http接口地址
  lv_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d'.
  ls_data-msgtype = 'file'.
  ls_data-file-media_id = p_ev_media_id.
  lv_json_str = ZCL_JSON=>serialize( data = ls_data compress = abap_true pretty_name = ZCL_JSON=>pretty_mode-camel_case ).
  REPLACE ALL OCCURRENCES OF 'mediaId' IN  lv_json_str WITH 'media_id'.

  "创建客户端请求
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    "lv_subrc = sy-subrc.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
               sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  " 设置content type和character set
  lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).

  " 设置方法为 post
  lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

  " 设置待传输内容
  lv_len = strlen( lv_json_str ).
  CALL METHOD lo_http_client->request->set_cdata
    EXPORTING
      data   = lv_json_str
      offset = 0
      length = lv_len.

  " 发送请求
  lo_http_client->send(  EXCEPTIONS http_communication_failure = 1
                                    http_invalid_state         = 2 ).

  IF sy-subrc <> 0.
    "操作失败,获取失败原因
    lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).
    lv_mtype = 'E'.
    EXIT.
  ENDIF.

  " 读取远程服务返回的结果消息。
  lo_http_client->receive( EXCEPTIONS http_communication_failure = 1
                                      http_invalid_state         = 2
                                      http_processing_failed     = 3 ).

  IF sy-subrc <> 0 .
    " lv_subrc = sy-subrc.
    lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code  ).
    lv_mtype = 'E'.
    WRITE: lv_message, lv_code.
    EXIT.
  ELSE.
    " 读取返回返回内容
    CLEAR lv_resp.
    lv_resp = lo_http_client->response->get_cdata( ).
    WRITE:lv_resp.
  ENDIF.
ENDFORM.                    " HTTP_POST
复制代码

 

复制代码
REPORT ZTEST666.



DATA:
  lo_http_client          TYPE REF TO if_http_client,
  lv_service              TYPE string,
  lv_result_string        TYPE string,
  lv_len                  TYPE i,
  lv_msg                  TYPE string,
  lv_message              TYPE string,
  lv_http_method          TYPE string,
  lv_string               TYPE string,
  lv_xstring              TYPE xstring,
  lv_media_id             TYPE string,
  lv_head_field           TYPE string,
  lo_entity               TYPE REF TO if_http_entity,
  lv_name                 TYPE string,
  lv_filename             TYPE string,
  lv_field_symbols_string TYPE string,
  lo_respone_data         TYPE REF TO data,
  part                    TYPE REF TO if_http_entity,
  lv_fielname_length      TYPE i.


DATA: lr_result_data TYPE REF TO data,
      lr_data_line   TYPE REF TO data.
DATA: lo_excel_export_service    TYPE REF TO cl_salv_export_tool_xls,
      lo_salv_export_column_conf TYPE REF TO if_salv_export_column_conf,
      lo_configuration           TYPE REF TO if_salv_export_configuration.
DATA: lv_content   TYPE cl_salv_export_tool_xls=>y_file_content,
      lv_mime_type TYPE cl_salv_export_tool_xls=>y_mime_type,

      lt_infos     TYPE cl_salv_export_tool_xls=>yt_msg,    "#EC NEEDED
      lt_warnings  TYPE cl_salv_export_tool_xls=>yt_msg.    "#EC NEEDED
DATA: lo_table_rtti    TYPE REF TO cl_abap_tabledescr,
      lt_dfies         TYPE ddfields,
      ls_dfies         TYPE dfies,
      lo_field_catalog TYPE REF TO cl_abap_structdescr.
DATA: lv_fieldname    TYPE string,
      lt_fieldcat     TYPE lvc_t_fcat,
      ls_fieldcat     TYPE lvc_s_fcat,
      lv_headtext     TYPE string,
      lv_bin_filesize TYPE i,
      lt_data_tab     TYPE TABLE OF solisti1.
DATA:et_table TYPE TABLE OF ZPPT001.

DATA:iv_key TYPE  STRING VALUE 'f5aae1cb-fa8e-4166-8cb5-32be27bb933d'.
DATA:iv_field_name TYPE  STRING VALUE '888.XLS'.

SELECT * INTO TABLE et_table[] FROM ZPPT001.

FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
CREATE DATA lr_result_data LIKE et_table[].
ASSIGN lr_result_data->* TO <lt_result>.
<lt_result> = et_table[].
lo_excel_export_service = cl_salv_export_tool_xls=>create_for_excel( lr_result_data ).
lo_configuration = lo_excel_export_service->configuration( ).
CREATE DATA lr_data_line LIKE LINE OF <lt_result>.
lo_field_catalog ?= cl_abap_tabledescr=>describe_by_data_ref( lr_data_line ).
lt_dfies = cl_salv_data_descr=>read_structdescr( lo_field_catalog ).
LOOP AT lt_dfies INTO ls_dfies.
  " Text
  CLEAR ls_fieldcat.
  READ TABLE lt_fieldcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname.
  IF ls_fieldcat-coltext IS NOT INITIAL.
    lv_headtext = ls_fieldcat-coltext.
  ELSE.
    lv_headtext = ls_dfies-scrtext_l.
  ENDIF.
  lv_fieldname = ls_dfies-fieldname.
  lo_salv_export_column_conf = lo_configuration->add_column(
  header_text = lv_headtext
  field_name = lv_fieldname
  display_type = if_salv_export_column_conf=>display_types-text_view
  ).
ENDLOOP.
lo_excel_export_service->check_configuration(
  IMPORTING
    t_messages_info    = lt_infos
    t_messages_warning = lt_warnings
).
TRY.
    lo_excel_export_service->read_result(
      IMPORTING
        content            = lv_content
        mime_type          = lv_mime_type
        filename           = lv_filename
        t_messages_info    = lt_infos
        t_messages_warning = lt_warnings
    ).
  CATCH cx_salv_export_error.                           "#EC NO_HANDLER
ENDTRY.
lv_xstring = lv_content.


*https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE
*https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d

lv_service = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=' && iv_key && '&type=file'.

CALL METHOD cl_http_client=>create_by_url
  EXPORTING
    url                = lv_service
  IMPORTING
    client             = lo_http_client
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3.

CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

CALL METHOD lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).

CALL METHOD lo_http_client->request->if_http_entity~set_content_type(
  EXPORTING
    content_type = 'multipart/form-data' ).

CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
  EXPORTING
    formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.

part = lo_http_client->request->if_http_entity~add_multipart( ).

*    LV_FILENAME = CL_HTTP_UTILITY=>UNESCAPE_URL( IV_FIELD_NAME ).
lv_filename = iv_field_name.
lv_fielname_length = strlen( lv_filename ).
*    LV_FILENAME = CL_HTTP_UTILITY=>ESCAPE_URL( IV_FIELD_NAME ).

lv_head_field = 'form-data; name="media";filename="' && lv_filename && '"; filelength=' && lv_fielname_length .
CALL METHOD part->set_header_field
  EXPORTING
    name  = 'Content-Disposition'
    value = lv_head_field.
*  lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
CALL METHOD part->set_content_type
  EXPORTING
*   content_type = 'application/octet-stream; charset=utf-8'.
    content_type = 'multipart/form-data; charset=utf-8'.
*        content_type = 'text/plain'.   multipart/form-data
*multipart/form-data; boundary=<calculated when request is sent>

lv_len = xstrlen( lv_xstring ).

CALL METHOD part->set_data
  EXPORTING
    data   = lv_xstring
    offset = 0
    length = lv_len.

*FIELD-SYMBOL:<fs_media_id> TYPE ANY.
FIELD-SYMBOLS <fs_media_id> TYPE any.

TYPES:BEGIN OF TY_U,
  errcode TYPE  STRING,
  errmsg TYPE  STRING,
  type TYPE  STRING,
  media_id TYPE STRING,
  created_at TYPE STRING,
  END OF TY_U.
DATA:LS_U TYPE TY_U.
DATA:LT_U TYPE TY_U.

CALL METHOD lo_http_client->send
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3
    OTHERS                     = 4.

"读取远程服务返回的处理过结果。
CALL METHOD lo_http_client->receive
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.
IF sy-subrc <> 0 .
  lo_http_client->get_last_error( IMPORTING message = lv_message ).
*    zmesg-message = lv_message.
*    zmesg-type = 'E'.
*    APPEND zmesg.
  RETURN.
ELSE.
  lv_result_string = lo_http_client->response->get_cdata( ).

  ZCL_JSON=>deserialize( EXPORTING json = lv_result_string pretty_name = ZCL_JSON=>pretty_mode-camel_case CHANGING data = LS_U ).
*READ TABLE LT_U INTO LS_U INDEX 1.
*  lo_respone_data = ZCL_UI2_CL_JSON=>generate( json = lv_result_string ).
  IF LS_U IS NOT INITIAL.
*    lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'.
*    ASSIGN (lv_field_symbols_string) TO <fs_media_id>.


*    IF <fs_media_id> IS ASSIGNED.
*     ev_media_id = <fs_media_id>.
    PERFORM http_post USING LS_U-MEDIA_ID.
*        zmesg-type = 'S'.
*        zmesg-message = TEXT-s04 && ev_media_id .
*        APPEND zmesg.
*    ELSE.
*        zmesg-type = 'E'.
*        zmesg-message = lv_result_string .
*        APPEND zmesg.
*    ENDIF.
  ELSE.
*      zmesg-type = 'E'.
*      zmesg-message = lv_result_string .
*      APPEND zmesg.
  ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*&      Form  HTTP_POST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_EV_MEDIA_ID  text
*----------------------------------------------------------------------*
FORM HTTP_POST  USING    p_ev_media_id.
  DATA:lv_json_str TYPE  string.
  DATA: lv_url TYPE string.     "http 服务接口地址
  DATA: lo_http_client  TYPE REF TO if_http_client.
  DATA: lv_len TYPE i."发送报文长度
  DATA: lv_resp TYPE string.

  DATA: lv_message  TYPE string.
  DATA: lv_mtype    TYPE bapi_mtype.
  DATA: lv_code     TYPE sysubrc.

  DATA:ls_data TYPE zttmesg.

  " 设置http接口地址
  lv_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5aae1cb-fa8e-4166-8cb5-32be27bb933d'.
  ls_data-msgtype = 'file'.
  ls_data-file-media_id = p_ev_media_id.
  lv_json_str = ZCL_JSON=>serialize( data = ls_data compress = abap_true pretty_name = ZCL_JSON=>pretty_mode-camel_case ).
  REPLACE ALL OCCURRENCES OF 'mediaId' IN  lv_json_str WITH 'media_id'.

  "创建客户端请求
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    "lv_subrc = sy-subrc.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
               sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  " 设置content type和character set
  lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).

  " 设置方法为 post
  lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

  " 设置待传输内容
  lv_len = strlen( lv_json_str ).
  CALL METHOD lo_http_client->request->set_cdata
    EXPORTING
      data   = lv_json_str
      offset = 0
      length = lv_len.

  " 发送请求
  lo_http_client->send(  EXCEPTIONS http_communication_failure = 1
                                    http_invalid_state         = 2 ).

  IF sy-subrc <> 0.
    "操作失败,获取失败原因
    lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).
    lv_mtype = 'E'.
    EXIT.
  ENDIF.

  " 读取远程服务返回的结果消息。
  lo_http_client->receive( EXCEPTIONS http_communication_failure = 1
                                      http_invalid_state         = 2
                                      http_processing_failed     = 3 ).

  IF sy-subrc <> 0 .
    " lv_subrc = sy-subrc.
    lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code  ).
    lv_mtype = 'E'.
    WRITE: lv_message, lv_code.
    EXIT.
  ELSE.
    " 读取返回返回内容
    CLEAR lv_resp.
    lv_resp = lo_http_client->response->get_cdata( ).
    WRITE:lv_resp.
  ENDIF.
ENDFORM.                    " HTTP_POST
复制代码

 

 

复制代码
FUNCTION zfm_send_file.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_KEY) TYPE  STRING
*"     VALUE(IV_FIELD_NAME) TYPE  STRING
*"  EXPORTING
*"     REFERENCE(EV_MEDIA_ID) TYPE  STRING
*"  TABLES
*"      ZMESG STRUCTURE  BAPIRET2
*"      ET_TABLE TYPE  TABLE
*"----------------------------------------------------------------------
 
*-----------------------------------------------------------------------
* create function for log
*-----------------------------------------------------------------------
 
 
  DATA:
    lo_http_client          TYPE REF TO if_http_client,
    lv_service              TYPE string,
    lv_result_string        TYPE string,
    lv_len                  TYPE i,
    lv_msg                  TYPE string,
    lv_message              TYPE string,
    lv_http_method          TYPE string,
    lv_string               TYPE string,
    lv_xstring              TYPE xstring,
    lv_media_id             TYPE string,
    lv_head_field           TYPE string,
    lo_entity               TYPE REF TO if_http_entity,
    lv_name                 TYPE string,
    lv_filename             TYPE string,
    lv_field_symbols_string TYPE string,
    lo_respone_data         TYPE REF TO data,
    part                    TYPE REF TO if_http_entity,
    lv_fielname_length      TYPE i.
 
 
  DATA: lr_result_data TYPE REF TO data,
        lr_data_line   TYPE REF TO data.
  DATA: lo_excel_export_service    TYPE REF TO cl_salv_export_tool_xls,
        lo_salv_export_column_conf TYPE REF TO if_salv_export_column_conf,
        lo_configuration           TYPE REF TO if_salv_export_configuration.
  DATA: lv_content   TYPE cl_salv_export_tool_xls=>y_file_content,
        lv_mime_type TYPE cl_salv_export_tool_xls=>y_mime_type,
 
        lt_infos     TYPE cl_salv_export_tool_xls=>yt_msg,  "#EC NEEDED
        lt_warnings  TYPE cl_salv_export_tool_xls=>yt_msg.  "#EC NEEDED
  DATA: lo_table_rtti    TYPE REF TO cl_abap_tabledescr,
        lt_dfies         TYPE ddfields,
        ls_dfies         TYPE dfies,
        lo_field_catalog TYPE REF TO cl_abap_structdescr.
  DATA: lv_fieldname    TYPE string,
        lt_fieldcat     TYPE lvc_t_fcat,
        ls_fieldcat     TYPE lvc_s_fcat,
        lv_headtext     TYPE string,
        lv_bin_filesize TYPE i,
        lt_data_tab     TYPE TABLE OF solisti1.
 
 
  FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
  CREATE DATA lr_result_data LIKE et_table[].
  ASSIGN lr_result_data->* TO <lt_result>.
  <lt_result> = et_table[].
  lo_excel_export_service = cl_salv_export_tool_xls=>create_for_excel( lr_result_data ).
  lo_configuration = lo_excel_export_service->configuration( ).
  CREATE DATA lr_data_line LIKE LINE OF <lt_result>.
  lo_field_catalog ?= cl_abap_tabledescr=>describe_by_data_ref( lr_data_line ).
  lt_dfies = cl_salv_data_descr=>read_structdescr( lo_field_catalog ).
  LOOP AT lt_dfies INTO ls_dfies.
    " Text
    CLEAR ls_fieldcat.
    READ TABLE lt_fieldcat INTO ls_fieldcat WITH KEY fieldname = ls_dfies-fieldname.
    IF ls_fieldcat-coltext IS NOT INITIAL.
      lv_headtext = ls_fieldcat-coltext.
    ELSE.
      lv_headtext = ls_dfies-scrtext_l.
    ENDIF.
    lv_fieldname = ls_dfies-fieldname.
    lo_salv_export_column_conf = lo_configuration->add_column(
    header_text = lv_headtext
    field_name = lv_fieldname
    display_type = if_salv_export_column_conf=>display_types-text_view
    ).
  ENDLOOP.
  lo_excel_export_service->check_configuration(
    IMPORTING
      t_messages_info    = lt_infos
      t_messages_warning = lt_warnings
  ).
  TRY.
      lo_excel_export_service->read_result(
        IMPORTING
          content            = lv_content
          mime_type          = lv_mime_type
          filename           = lv_filename
          t_messages_info    = lt_infos
          t_messages_warning = lt_warnings
      ).
    CATCH cx_salv_export_error.                         "#EC NO_HANDLER
  ENDTRY.
  lv_xstring = lv_content.
 
 
 
  lv_service = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=' && iv_key && '&type=file'.
 
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_service
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3.
 
  CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
 
  CALL METHOD lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).
 
  CALL METHOD lo_http_client->request->if_http_entity~set_content_type(
    EXPORTING
      content_type = 'multipart/form-data' ).
 
  CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
    EXPORTING
      formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.
 
  part = lo_http_client->request->if_http_entity~add_multipart( ).
 
*    LV_FILENAME = CL_HTTP_UTILITY=>UNESCAPE_URL( IV_FIELD_NAME ).
  lv_filename = iv_field_name.
  lv_fielname_length = strlen( lv_filename ).
*    LV_FILENAME = CL_HTTP_UTILITY=>ESCAPE_URL( IV_FIELD_NAME ).
 
  lv_head_field = 'form-data; name="media";filename="' && lv_filename && '"; filelength=' && lv_fielname_length .
  CALL METHOD part->set_header_field
    EXPORTING
      name  = 'Content-Disposition'
      value = lv_head_field.
 
  CALL METHOD part->set_content_type
    EXPORTING
      content_type = 'application/octet-stream'.
*        content_type = 'text/plain'.
 
  lv_len = xstrlen( lv_xstring ).
 
  CALL METHOD part->set_data
    EXPORTING
      data   = lv_xstring
      offset = 0
      length = lv_len.
 
 
  CALL METHOD lo_http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
 
  "读取远程服务返回的处理过结果。
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
  IF sy-subrc <> 0 .
    lo_http_client->get_last_error( IMPORTING message = lv_message ).
*    ZMESG-MESSAGE = LV_MESSAGE.
*    ZMESG-TYPE = 'E'.
    RETURN.
  ELSE.
    lv_result_string = lo_http_client->response->get_cdata( ).
    lo_respone_data = /ui2/cl_json=>generate( json = lv_result_string ).
    IF lo_respone_data IS NOT INITIAL.
      lv_field_symbols_string = 'LO_RESPONE_DATA->MEDIA_ID->*'.
      ASSIGN (lv_field_symbols_string) TO FIELD-SYMBOL(<fs_media_id>).
      IF <fs_media_id> IS ASSIGNED.
        ev_media_id = <fs_media_id>.
        zmesg-type = 'S'.
        zmesg-message = text-s04 && ev_media_id .
        APPEND zmesg.
      ELSE.
        zmesg-type = 'E'.
        zmesg-message = lv_result_string .
        APPEND zmesg.
      ENDIF.
    ELSE.
      zmesg-type = 'E'.
      zmesg-message = lv_result_string .
      APPEND zmesg.
    ENDIF.
  ENDIF.
*-----------------------------------------------------------------------
* SAVE function log
ENDFUNCTION.
复制代码

 

posted @   ABAP-武汉  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示