【ABAP系列】SAP ABAP 實現FTP的文件上傳與下載


公眾號: matinal
本文作者: matinal
 

 

前言部分

大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。

正文部分

在SAP的實際應用中,經常會需要將生成的文件上傳到FTP,或從FTP下載相關文檔數據。本例實現將本地指定文件上傳到FTP,及從FTP下載文件到本地的功能。


從FTP復制文件共有兩種方式,一種是直接復制文件,另一種方式是先從FTP讀取文件數據到內表,拷貝再寫入指定位置文件,不過該功能僅支持文本格式文件(*.TXT,*.DAT),一般不予推薦。


相關函數:


1)FTP_CONNECT:通過賬號連接FTP。


2)FTP_COMMAND:執行FTP操作命令(注意,程序中所有命令必須為小寫)。


1cd:指定本地文件夾路徑;


cd:指定FTP文件夾路徑;


put <filename>:上傳文件;


get <filename>:下載文件;


3)FTP_SERVER_TO_R3:將FTP上的指定文本文件數據讀取到內表。


4)FTP_DISCONNECT:關閉FTP連接。

REPORT ZR_EXAMPLE_07 .  
DATA: KEY TYPE I VALUE 26101957,  
    TRFCDEST   LIKE RFCDES-RFCDEST,  
    THANDLE    TYPE I.  
 
INCLUDE:<ICON>.  
*定義輸入界面  
SELECTION-SCREEN:BEGIN OF BLOCK FTPLOGIN WITH FRAME TITLE TEXT-001.  
PARAMETERS: P_USER(45) LOWER CASE OBLIGATORY MEMORY ID USR,  
           P_PWD(45) MODIF ID PWD LOWER CASE OBLIGATORY MEMORY ID PWD,  
           P_HOST(15) MEMORY ID HOS OBLIGATORY,  
           FTP_PATH(30) MEMORY ID FPOS OBLIGATORY.  
SELECTION-SCREEN:END OF BLOCK FTPLOGIN.  
 
SELECTION-SCREEN:BEGIN OF BLOCK UPLOAD WITH FRAME TITLE TEXT-002.  
PARAMETERS: P_UPPATH(45),  
         P_FILE(20) .  
SELECTION-SCREEN: BEGIN OF LINE.  
SELECTION-SCREEN: PUSHBUTTON 1(20) PUBU USER-COMMAND UPLOAD.  
SELECTION-SCREEN: END OF LINE.  
SELECTION-SCREEN:END OF BLOCK UPLOAD.  
 
SELECTION-SCREEN:BEGIN OF BLOCK DOWNLOAD WITH FRAME TITLE TEXT-003.  
PARAMETERS: DL_PATH(45),  
           DL_FILE(20) .  
SELECTION-SCREEN: BEGIN OF LINE.  
SELECTION-SCREEN: PUSHBUTTON 1(20) GEBU USER-COMMAND DOWNLOAD.  
SELECTION-SCREEN: PUSHBUTTON 24(30) SHBU USER-COMMAND ITAB_DL.  
SELECTION-SCREEN: END OF LINE.  
SELECTION-SCREEN:END OF BLOCK DOWNLOAD.  
 
AT SELECTION-SCREEN OUTPUT.  
* 對密碼輸入欄進行加密處理  
  PERFORM MASK_PWD.  
 
* 給各按鈕加入文本及圖標  
  WRITE ICON_OUTGOING_OBJECT  AS ICON TO PUBU.  
  CONCATENATE PUBU 'Upload FTP' INTO PUBU SEPARATED BY SPACE.  
 
  WRITE ICON_INCOMING_OBJECT  AS ICON TO GEBU.  
  CONCATENATE GEBU 'FTP download' INTO GEBU SEPARATED BY SPACE.  
 
  WRITE ICON_WRITE_FILE  AS ICON TO SHBU.  
  CONCATENATE SHBU 'Internal table download' INTO SHBU SEPARATED BY  
SPACE.  
 
AT SELECTION-SCREEN.  
  PERFORM FTPCONNECT.  
  IF SY-SUBRC <> 0.  
 MESSAGE I001(00) WITH 'Can''t connect to FTP!'.  
 EXIT.  
  ENDIF.  
 
  MESSAGE S001(00) WITH 'FTP connect OK!'.  
  CASE SY-UCOMM.  
 WHEN 'ONLI'.  
   PERFORM FTPDISCONNECT.  
   EXIT.  
  ENDCASE. 

​
*執行FTP功能  
  PERFORM FTP_EXECUTE.  
*關閉FTP連接  
  PERFORM FTPDISCONNECT.  
*-----------------------------------------------------------------------------*  
*       改變密碼輸入框顯示屬性,實現密碼保護        *  
*-----------------------------------------------------------------------------*  
FORM MASK_PWD.  
  LOOP AT SCREEN .  
 IF SCREEN-NAME = 'P_PWD'.  
   SCREEN-INVISIBLE = '1'.  
   MODIFY SCREEN .  
   CONTINUE.  
 ENDIF.  
  ENDLOOP.  
ENDFORM.                    "  
 
*-----------------------------------------------------------------------------*  
*       通過IP、用戶名、密碼連接FTP服務器         *  
*-----------------------------------------------------------------------------*  
FORM FTPCONNECT.  
  DATA: THOSTS(45),TUSERS(45),TPWORD(45).  
  THOSTS = P_HOST.  
  TUSERS = P_USER.  
  TPWORD = P_PWD.  
* 對密碼數值進行加密解析處理  
  CALL 'AB_RFC_X_SCRAMBLE_STRING'     " System Function  
 ID 'SOURCE'      FIELD TPWORD  
 ID 'KEY'         FIELD KEY  
 ID 'SCR'         FIELD 'X'  
 ID 'DESTINATION' FIELD TPWORD  
 ID 'DSTLEN'      FIELD 64.  
 
* 定義RFC連接目標,前后台執行時不同  
  IF SY-BATCH = 'X'.  
 TRFCDEST = 'SAPFTPA'.  
  ELSE.  
 TRFCDEST = 'SAPFTP'.  
  ENDIF.  
 
*該函數可以定義有網關時賬戶密碼,一般公司內部訪問時無此設置  
  CALL FUNCTION 'FTP_CONNECT'  
 EXPORTING  
   USER                 = TUSERS 
   PASSWORD             = TPWORD 
   HOST                 = THOSTS 
   RFC_DESTINATION      = TRFCDEST 
IMPORTING  
  HANDLE                = THANDLE 
EXCEPTIONS  
  NOT_CONNECTED     = 1 
  OTHERS                = 2.  
ENDFORM.                " FTPCONNECT  
*&---------------------------------------------------------------------  
*&     設置結束時關閉SAP  
*&---------------------------------------------------------------------  
FORM FTPDISCONNECT.  
  CALL FUNCTION 'FTP_DISCONNECT'  
    EXPORTING  
         HANDLE = THANDLE.  
ENDFORM.                    " FTPDISCONNECT  
*&---------------------------------------------------------------------*  
*&      通過SAP執行命令上傳或下載FTP文件  
*&---------------------------------------------------------------------*  
FORM FTP_EXECUTE.  
  DATA:TSUBRC LIKE SY-SUBRC.  
  DATA:BEGIN OF COM OCCURS 0,  
      CMD(100) TYPE C,  
    END OF COM.  
  DATA:BEGIN OF RES OCCURS 0,  
      LINE(100) TYPE C,  
    END OF RES.  
 
*指定FTP文件夾路徑  
  IF NOT FTP_PATH IS INITIAL.  
 CONCATENATE 'cd' FTP_PATH INTO COM-CMD SEPARATED BY ' '.  
 APPEND COM.  
  ENDIF.  
 
  CASE SY-UCOMM.  
 WHEN 'UPLOAD'.  
*指定上傳文件夾路徑及上傳文件命令  
   CONCATENATE 'lcd' P_UPPATH INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
   CONCATENATE 'put' P_FILE INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
 
 WHEN 'DOWNLOAD'.  
*指定下載文件夾路徑及下載文件命令  
   CONCATENATE 'lcd' DL_PATH INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
   CONCATENATE 'get' DL_FILE INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
  ENDCASE.  
 
  LOOP AT COM FROM 1.  
 IF COM-CMD <> ''.  
*執行FTP指令  
   CALL FUNCTION 'FTP_COMMAND'  
        EXPORTING  
             HANDLE        = THANDLE 
             COMCOMMAND       = COM-CMD  
        TABLES  
             DATA          = RES 
        EXCEPTIONS  
             TCPIP_ERROR   = 1 
             COMMAND_ERROR = 2 
             DATA_ERROR    = 3 
             OTHERS        = 4.  
 
*當執行失敗時回執數據並退出  
   IF SY-SUBRC <> 0.  
     CASE SY-UCOMM.  
       WHEN 'UPLOAD'.  
         MESSAGE E001(00) WITH 'FTP UPLOAD FAIL!'.  
       WHEN 'DOWNLOAD'.  
         MESSAGE E001(00) WITH 'FTP DOWNLOAD FAIL!'.  
     ENDCASE.  
     EXIT.  
   ELSE.  
 
*根據不同按鈕的功能碼判斷程序執行邏輯及回執信息,當選擇從內表下載功能時轉入子程序  
     CASE SY-UCOMM.  
       WHEN 'UPLOAD'.  
         MESSAGE S001(00) WITH 'FTP UPLOAD SUCCESS!'.  
       WHEN 'DOWNLOAD'.  
         MESSAGE S001(00) WITH 'FTP DOWNLOAD SUCCESS!'.  
       WHEN 'ITAB_DL'.  
         PERFORM DL_ITAB USING THANDLE DL_PATH DL_FILE.  
     ENDCASE.  
   ENDIF.  
 ENDIF.  
  ENDLOOP.  
 
  CLEAR:COM,RES,TSUBRC.  
  REFRESH:COM,RES.  
ENDFORM.                    " FTPPUTFILE 
*---------------------------------------------------------------------*  
*      將FTP文本類型文件數據讀取到內表       *  
*---------------------------------------------------------------------*  
FORM DL_ITAB USING THANDLE  TYPE I  
                VALUE(FILEPATH) TYPE C  
                FILENAME TYPE C.  
  DATA: BEGIN OF BLOB OCCURS 0,  
       LINE(255) TYPE C,  
     END OF BLOB.  
*連接字符串定義本地文件具體路徑  
CONCATENATE FILEPATH FILENAME INTO FILEPATH.  
 
*將FTP文本類型文件數據讀取到內表  
*若所讀FTP文件為非文本文件(*.txt,*.dat)時將出現錯誤  
  CALL FUNCTION 'FTP_SERVER_TO_R3'  
    EXPORTING  
         HANDLE = THANDLE 
         FNAME  = FILENAME 
    TABLES  
         BLOBBLOB   = BLOB.  
 
*讀取文件失敗時退出程序並回執錯誤  
  IF SY-SUBRC <> 0.  
 MESSAGE E001(00) WITH 'Read FTP File FAIL!'.  
 EXIT.  
  ENDIF.  
 
*將內表數據下載到本地文件  
  CALL FUNCTION 'WS_DOWNLOAD'  
    EXPORTING  
         FILENAME            = FILEPATH 
         FILETYPE            = 'DAT' 
    TABLES  
         DATA_TAB            = BLOB 
    EXCEPTIONS  
         FILE_OPEN_ERROR     = 1 
         FILE_WRITE_ERROR    = 2 
         INVALID_FILESIZE    = 3 
         INVALID_TABLE_WIDTH = 4 
         INVALID_TYPE        = 5.  
 
*將數據寫入本地文件失敗時回執錯誤  
  IF SY-SUBRC <> 0.  
 MESSAGE E001(00) WITH 'FTP Download By Internal table FAIL!'.  
  ELSE.  
 MESSAGE S001(00) WITH 'FTP Download By Internal table SUCCESS!'.  
  ENDIF.  
ENDFORM. 

​

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM