Part of the EPO Connector comes a report for uploading transport order files onto your SAP server.
Transport files (*.zip) for EPO solutions are available the EPO - NextCloud, Software Download.
This report evaluates the DATA- and COFILES - directory on the server and can write the tranport files directly to the desired folders.
Select the 'upload' checkbox and select the .zip - file.

After running the report (F8) the files are copied onto the SAP server.
As a little help, the number of the transport order will be copied into your clipboard.
If this report is not available, use transaction CG3Z to upload the 'K'- and 'R' file (extracted from the .ZIP) into the transport directory, or ask the SAP basis team in your company for help.
Alternatively, implement and run the mini-transport report (see appendix).
When the cofile and the data file of the transport are existing in the transport folder, you may import the transport into your system.
Open transaction STMS, select the import system and add the transport to the import queue:

Enter the transport number (paste from the clipboard).
Afterwards, the transport can be selected and imported as usual:

..with the option to ignore invalid component versions (if this option is visible):

In order to transport the imported objects to test- and productive system, create a new transport order:
Transaction SE09 (or SE10), create a new workbench/customizing transport, add the objects of the imported WK1 - transport order:

Release the transport order and transport according Your standard transport rules.
The report /EPO1/TRANSPORT is contained in the SP12 - transport package. In order to make the very first import easier, the following report could be implemented on the development system in a local package (not intended to be transported!) - change the report name to Your needs.
Please note, that the texts for the selection screen are missing (but they are not really necessary).
*&---------------------------------------------------------------------*
*& Report ZEPO_TRANSPORT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZEPO_TRANSPORT.
  " upload / download of transport files;
  " local files are stored/expected in a single ZIP file
  TYPES:
    BEGIN OF gty_trans_dir,
      data    TYPE trfile,
      cofiles TYPE trfile,
    END OF gty_trans_dir,
    gty_zip_file LIKE LINE OF cl_abap_zip=>files.
  CONSTANTS:
    c_file_filter_zip TYPE string VALUE 'zip|*.zip|all files|*.*'.
  DATA:
    gs_trans_dir             TYPE gty_trans_dir,
    gv_error_flag            TYPE flag,
    gv_server_file_separator TYPE c.
" screen parameters
SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE text-t03.
  PARAMETERS: p_dir_c TYPE trfile MODIF ID ro,
              p_dir_d TYPE trfile MODIF ID ro.
SELECTION-SCREEN END OF BLOCK c.
" upload
SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-t02.
  PARAMETERS: " upload from local file
              p_file_u TYPE file_table-filename.
SELECTION-SCREEN END OF BLOCK b.
INITIALIZATION.
  " get the STMS transport directories
  PERFORM get_trans_dir CHANGING gs_trans_dir.
  p_dir_d = gs_trans_dir-data.
  p_dir_c = gs_trans_dir-cofiles.
  " get the file separator
  CASE sy-opsys.
  WHEN 'Windows NT'.
    gv_server_file_separator = '\'.
  WHEN OTHERS.
    gv_server_file_separator = '/'.
  ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file_u.
  " upload - select an (existing) file
  DATA:
      g_ft TYPE filetable,
      g_rc TYPE i.
  CLEAR g_ft.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      FILE_FILTER             = c_file_filter_zip
    CHANGING
      file_table              = g_ft
      rc                      = g_rc
  EXCEPTIONS
    file_open_dialog_failed = 1
    cntl_error              = 2
    error_no_gui            = 3
    not_supported_by_gui    = 4
    OTHERS                  = 5
          .
  CASE sy-subrc .
    WHEN 0. READ TABLE g_ft INTO p_file_u INDEX 1.
  ENDCASE.
AT SELECTION-SCREEN OUTPUT.
  " set parameters read only
  DATA:
    ls_screen TYPE screen.
  " make parameters read-only
  LOOP AT screen INTO ls_screen.
    IF ls_screen-group1 = 'RO'.
      ls_screen-input = 0.
      MODIFY screen FROM ls_screen.
    ENDIF.
  ENDLOOP.
AT SELECTION-SCREEN.
  " check for inputs..
  IF p_file_u IS INITIAL.
    MESSAGE text-e02 TYPE 'E'.
  ENDIF.
START-OF-SELECTION.
  DATA:
    lv_file_xstring TYPE xstring.
  " upload
  " from local
  PERFORM upload_from_local USING p_file_u
                         CHANGING lv_file_xstring.
  " save server files (from ZIP)
  PERFORM save_zip_to_server USING lv_file_xstring
                                   gv_server_file_separator
                                   gs_trans_dir.
*&---------------------------------------------------------------------*
*&      Form  GET_TRANS_DIR
*&---------------------------------------------------------------------*
*       Get the transport directories (on the application server)
*----------------------------------------------------------------------*
FORM GET_TRANS_DIR  CHANGING cs_trans_dir TYPE gty_trans_dir.
  DATA:
    lt_tefi TYPE TABLE OF stmsttefi,
    ls_tefi LIKE LINE OF  lt_tefi.
  CALL FUNCTION 'TMS_TP_CHECK_TRANS_DIR'
    TABLES
      TT_TEFI                    = lt_tefi
    EXCEPTIONS
      PERMISSION_DENIED          = 1
      GET_DIR_NAMES_FAILED       = 2
      BUILD_PATH_FAILED          = 3
      OTHERS                     = 4
            .
  IF SY-SUBRC <> 0.
    WRITE:
      / 'error when retrieving the transport directory'.
    RETURN.
  ENDIF.
  " read directories
  READ TABLE lt_tefi INTO ls_tefi TRANSPORTING path WITH KEY sysnam = sy-sysid
                                                             dir    = 'data'.
  IF sy-subrc = 0.
    cs_trans_dir-data = ls_tefi-path.
  ENDIF.
  READ TABLE lt_tefi INTO ls_tefi TRANSPORTING path WITH KEY dir = 'cofiles'.
  IF sy-subrc = 0.
    cs_trans_dir-cofiles = ls_tefi-path.
  ENDIF.
  " supply default parameters in case of errors
  IF cs_trans_dir-data IS INITIAL.
    cs_trans_dir-data = '/usr/sap/trans/data'.
  ENDIF.
  IF cs_trans_dir-cofiles IS INITIAL.
    cs_trans_dir-cofiles = '/usr/sap/trans/cofiles'.
  ENDIF.
ENDFORM.                    " GET_TRANS_DIR
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_FROM_LOCAL
*&---------------------------------------------------------------------*
*       upload from a local file
*----------------------------------------------------------------------*
FORM UPLOAD_FROM_LOCAL  USING    p_filename     TYPE file_table-filename
                        CHANGING c_file_xstring TYPE xstring.
  DATA:
    lv_filename    TYPE string,
    lv_file_length TYPE i,
    lt_data_tab    TYPE solix_tab,
    lv_symsgv1     TYPE symsg,
    lv_symsgv2     TYPE symsg.
  " upload the local file
  lv_filename = p_filename.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                      = lv_filename
      FILETYPE                      = 'BIN'
    IMPORTING
      FILELENGTH                    = lv_file_length
    TABLES
      DATA_TAB                      = lt_data_tab
    EXCEPTIONS
      FILE_OPEN_ERROR               = 1
      FILE_READ_ERROR               = 2
      NO_BATCH                      = 3
      GUI_REFUSE_FILETRANSFER       = 4
      INVALID_TYPE                  = 5
      NO_AUTHORITY                  = 6
      UNKNOWN_ERROR                 = 7
      BAD_DATA_FORMAT               = 8
      HEADER_NOT_ALLOWED            = 9
      SEPARATOR_NOT_ALLOWED         = 10
      HEADER_TOO_LONG               = 11
      UNKNOWN_DP_ERROR              = 12
      ACCESS_DENIED                 = 13
      DP_OUT_OF_MEMORY              = 14
      DISK_FULL                     = 15
      DP_TIMEOUT                    = 16
      OTHERS                        = 17
            .
  IF SY-SUBRC <> 0.
    gv_error_flag = 'X'.
    lv_symsgv1    = p_filename.
    lv_symsgv2    = sy-subrc.
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 004 WITH lv_symsgv1 lv_symsgv2.
    RETURN.
  ENDIF.
  " write some log:
  WRITE:
    / text-d06,
    / text-d03, p_filename,
    / text-d04, lv_file_length,
    /,
    / sy-uline,
    /.
  " convert to XSTRING
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      INPUT_LENGTH       = lv_file_length
    IMPORTING
      BUFFER             = c_file_xstring
    TABLES
      BINARY_TAB         = lt_data_tab
    EXCEPTIONS
      OTHERS             = 0  " ignore errors
            .
ENDFORM.                    " UPLOAD_FROM_LOCAL
*&---------------------------------------------------------------------*
*&      Form  SAVE_ZIP_TO_SERVER
*&---------------------------------------------------------------------*
*       Save the contents of the ZIP file to the server
*----------------------------------------------------------------------*
FORM SAVE_ZIP_TO_SERVER  USING    p_zip_xstring    TYPE xstring
                                  p_file_separator TYPE        c
                                  ps_trans_dir     TYPE gty_trans_dir.
  DATA:
    lr_zip         TYPE REF TO cl_abap_zip,
    lv_file        TYPE        gty_zip_file,
    lv_transport   TYPE        trkorr.
  CHECK gv_error_flag IS INITIAL.
  " create & fill ZIP
  CREATE OBJECT lr_zip.
  lr_zip->load(
    EXPORTING
      zip = p_zip_xstring
    EXCEPTIONS
      ZIP_PARSE_ERROR = 1
      others          = 2
       ).
  IF sy-subrc NE 0.
    gv_error_flag = 'X'.
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 005.
    RETURN.
  ENDIF.
  " save 'K' and 'R'-files to the transport directory
  LOOP AT lr_zip->files INTO lv_file.
    PERFORM save_file_to_server USING lr_zip
                                      lv_file
                                      p_file_separator
                                      ps_trans_dir
                             CHANGING lv_transport.
    IF gv_error_flag IS NOT INITIAL.
      " leave the loop in case of errors
      EXIT.
    ENDIF.
  ENDLOOP.
  " copy the transport number
  PERFORM copy_number_to_clipboard USING lv_transport.
ENDFORM.                    " SAVE_ZIP_TO_SERVER
*&---------------------------------------------------------------------*
*&      Form  SAVE_FILE_TO_SERVER
*&---------------------------------------------------------------------*
*       Save a file from the ZIP into the transport directory
*----------------------------------------------------------------------*
FORM SAVE_FILE_TO_SERVER  USING    pr_zip           TYPE REF TO cl_abap_zip
                                   ps_file          TYPE        gty_zip_file
                                   p_file_separator TYPE        c
                                   ps_trans_dir     TYPE        gty_trans_dir
                          CHANGING cv_transport     TYPE        trkorr.
  DATA:
    lv_file_name    TYPE trfile,
    lv_full_name    TYPE trfile,
    lv_file_xstring TYPE xstring,
    lv_file_length  TYPE i,
    lv_symsgv1      TYPE symsg,
    lv_symsgv2      TYPE symsg,
    lr_root         TYPE REF TO cx_root,
    lv_question     TYPE string,
    lv_answer       TYPE c.
  " check the file name
  lv_file_name = ps_file-name.
  CASE lv_file_name(1).
  WHEN 'K'.
    " cofiles.. prepare the file path
    lv_full_name = ps_trans_dir-cofiles.
  WHEN 'R'.
    " data.. prepare the file path
    lv_full_name = ps_trans_dir-data.
  WHEN OTHERS.
    " ignore this file
    RETURN.
  ENDCASE.
  " format the file name
  CONCATENATE lv_full_name p_file_separator ps_file-name INTO lv_full_name.
  " get the file contents
  pr_zip->get(
    EXPORTING
      name = ps_file-name
    IMPORTING
      content = lv_file_xstring
    EXCEPTIONS
      OTHERS = 1 ).
  IF sy-subrc NE 0.
    gv_error_flag = 'X'.
    lv_symsgv1    = ps_file-name.
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 006 WITH lv_symsgv1.
    RETURN.
  ENDIF.
  " format the transport-ID
  " e.g. K902485.I01
  " ->   I01K902485
  SPLIT ps_file-name AT '.' INTO cv_transport+3 cv_transport(3).
  cv_transport+3(1) = 'K'.
  " write some log:
  lv_file_length = xstrlen( lv_file_xstring ).
  WRITE:
    / text-d03, lv_full_name,
    / text-d04, lv_file_length,
    / text-d02, cv_transport,
    /.
  TRY.
    " prepare the error - case
    gv_error_flag = 'X'.
    lv_symsgv1    = lv_full_name.
    " check for an existing file on the server
    OPEN DATASET lv_full_name FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0.
      CLOSE DATASET lv_full_name.
      " ask to overwrite
      MESSAGE ID '/EPO1/TRANSPORT' TYPE 'I' NUMBER 020 WITH lv_file_name INTO lv_question.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          TITLEBAR                    = text-p01  " overwrite server file?
          TEXT_QUESTION               = lv_question
          DEFAULT_BUTTON              = '2'
          DISPLAY_CANCEL_BUTTON       = ''
        IMPORTING
          ANSWER                      = lv_answer
        EXCEPTIONS
          TEXT_NOT_FOUND              = 1
          OTHERS                      = 2
                .
      IF ( SY-SUBRC <> 0    ) OR
         ( lv_answer NE '1' ).
        " an error is the same as 'NO'
        WRITE:
          / text-p02,
          /.
        " return without error
        CLEAR gv_error_flag.
        RETURN.
      ENDIF.
    ENDIF. " popup for existing server file
    " save file to the server
    OPEN DATASET lv_full_name FOR OUTPUT IN BINARY MODE.
    IF sy-subrc NE 0.
      gv_error_flag = 'X'.
      lv_symsgv1    = lv_full_name.
      MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 007 WITH lv_symsgv1.
      RETURN.
    ENDIF.
    TRANSFER lv_file_xstring TO lv_full_name.
    " clear the error - flag (if there is no exception)
    CLEAR gv_error_flag.
  CATCH cx_sy_file_authority.
    " no authorisation
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 008 WITH lv_symsgv1.
  CATCH cx_sy_file_io.
    " IO-error
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 009 WITH lv_symsgv1.
  CATCH cx_root INTO lr_root.
    " other error
    lv_symsgv2 = lr_root->get_text( ).
    MESSAGE ID '/EPO1/TRANSPORT' TYPE 'E' NUMBER 010 WITH lv_symsgv1 lv_symsgv2.
  ENDTRY.
  " close the file
  CLOSE DATASET lv_full_name.
ENDFORM.                    " SAVE_FILE_TO_SERVER
*&---------------------------------------------------------------------*
*&      Form  COPY_NUMBER_TO_CLIPBOARD
*&---------------------------------------------------------------------*
*       Copy the transport number to the clipboard (prepare STMS)
*----------------------------------------------------------------------*
FORM COPY_NUMBER_TO_CLIPBOARD USING pv_transport TYPE trkorr.
  DATA:
    lt_data LIKE STANDARD TABLE OF pv_transport,
    lv_rc   TYPE i.
  CHECK pv_transport IS NOT INITIAL.
  APPEND pv_transport TO lt_data.
  cl_gui_frontend_services=>clipboard_export(
    IMPORTING
      data = lt_data
    CHANGING
      rc   = lv_rc ).
  IF lv_rc = 0.
    " success - write a message (ignore errors)
    WRITE: / text-d15,
           /.
  ENDIF.
ENDFORM.                    " COPY_NUMBER_TO_CLIPBOARD