zoukankan      html  css  js  c++  java
  • 【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. 
    
    ​
  • 相关阅读:
    知方可补不足~Sqlserver发布订阅与sql事务的关系
    基础才是重中之重~泛型类的静态构造方法可不是只执行一次呀
    EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一
    EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测
    windows服务的创建、安装和调试
    Axure RP 实践.1
    实习第一天之数据绑定:<%#Eval("PartyName")%>'
    Hadoop云计算大数据书籍分享
    Android利用setLayoutParams在代码中调整布局(Margin和居中)
    TopCoder中插件的用法
  • 原文地址:https://www.cnblogs.com/SAPmatinal/p/11183196.html
Copyright © 2011-2022 走看看