【ABAP系列】SAP ABAP 实现FTP的文件上传与下载
前言部分
大家可以关注我的公众号,公众号里的排版更好,阅读更舒适。
正文部分
在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 ,
TRFCDEST LIKE RFCDES-RFCDEST,
THANDLE TYPE I. INCLUDE:<ICON>.
*定义输入界面
SELECTION-SCREEN:BEGIN OF BLOCK FTPLOGIN WITH FRAME TITLE TEXT-.
PARAMETERS: P_USER() LOWER CASE OBLIGATORY MEMORY ID USR,
P_PWD() MODIF ID PWD LOWER CASE OBLIGATORY MEMORY ID PWD,
P_HOST() MEMORY ID HOS OBLIGATORY,
FTP_PATH() MEMORY ID FPOS OBLIGATORY.
SELECTION-SCREEN:END OF BLOCK FTPLOGIN. SELECTION-SCREEN:BEGIN OF BLOCK UPLOAD WITH FRAME TITLE TEXT-.
PARAMETERS: P_UPPATH(),
P_FILE() .
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: PUSHBUTTON () 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-.
PARAMETERS: DL_PATH(),
DL_FILE() .
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: PUSHBUTTON () GEBU USER-COMMAND DOWNLOAD.
SELECTION-SCREEN: PUSHBUTTON () 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 <> .
MESSAGE I001() WITH 'Can''t connect to FTP!'.
EXIT.
ENDIF. MESSAGE S001() 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 = ''.
MODIFY SCREEN .
CONTINUE.
ENDIF.
ENDLOOP.
ENDFORM. " *-----------------------------------------------------------------------------*
* 通过IP、用户名、密码连接FTP服务器 *
*-----------------------------------------------------------------------------*
FORM FTPCONNECT.
DATA: THOSTS(),TUSERS(),TPWORD().
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 . * 定义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 =
OTHERS = .
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 ,
CMD() TYPE C,
END OF COM.
DATA:BEGIN OF RES OCCURS ,
LINE() 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 .
IF COM-CMD <> ''.
*执行FTP指令
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
HANDLE = THANDLE
COMCOMMAND = COM-CMD
TABLES
DATA = RES
EXCEPTIONS
TCPIP_ERROR =
COMMAND_ERROR =
DATA_ERROR =
OTHERS = . *当执行失败时回执数据并退出
IF SY-SUBRC <> .
CASE SY-UCOMM.
WHEN 'UPLOAD'.
MESSAGE E001() WITH 'FTP UPLOAD FAIL!'.
WHEN 'DOWNLOAD'.
MESSAGE E001() WITH 'FTP DOWNLOAD FAIL!'.
ENDCASE.
EXIT.
ELSE. *根据不同按钮的功能码判断程序执行逻辑及回执信息,当选择从内表下载功能时转入子程序
CASE SY-UCOMM.
WHEN 'UPLOAD'.
MESSAGE S001() WITH 'FTP UPLOAD SUCCESS!'.
WHEN 'DOWNLOAD'.
MESSAGE S001() 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 ,
LINE() 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 <> .
MESSAGE E001() WITH 'Read FTP File FAIL!'.
EXIT.
ENDIF. *将内表数据下载到本地文件
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FILEPATH
FILETYPE = 'DAT'
TABLES
DATA_TAB = BLOB
EXCEPTIONS
FILE_OPEN_ERROR =
FILE_WRITE_ERROR =
INVALID_FILESIZE =
INVALID_TABLE_WIDTH =
INVALID_TYPE = . *将数据写入本地文件失败时回执错误
IF SY-SUBRC <> .
MESSAGE E001() WITH 'FTP Download By Internal table FAIL!'.
ELSE.
MESSAGE S001() WITH 'FTP Download By Internal table SUCCESS!'.
ENDIF.
ENDFORM.
【ABAP系列】SAP ABAP 实现FTP的文件上传与下载的更多相关文章
- 使用C#实现FTP的文件上传和下载【转】
参考博文:http://blog.163.com/mity_rui@126/blog/static/1098136182013101525615577/
- Java实现FTP文件上传与下载
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cl ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- SFTP文件上传与下载
SFTP是对ftp进行加密的一种文件协议. 首先是先引入:jsch-0.1.42-sources.jar与jsch-0.1.42.jar包 SFTP文件上传与下载. import java.io.Fi ...
- Nginx集群之WCF大文件上传及下载(支持6G传输)
目录 1 大概思路... 1 2 Nginx集群之WCF大文件上传及下载... 1 3 BasicHttpBinding相关配置解析... 2 4 编写 ...
- [实战]MVC5+EF6+MySql企业网盘实战(18)——文件上传,下载,修改
写在前面 经过一段时间的秀秀改改,终于把文件上传下载,修改文件夹文件名称的功能实现了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企 ...
- 用FileZilla服务器端和客户端实现本机与虚拟机之间文件上传和下载
1. FileZilla简介 2.准备工作3.安装 FileZilla Server和配置3.1.问题及解决方法3.2.添加目录3.3.测试FIP4.安装FileZilla Client5.连接服务器 ...
- C# 之 FTPserver中文件上传与下载(二)
通过上一篇博客<C# 之 FTPserver中文件上传与下载(一)>,我们已经创建好了一个FTPserver,而且该server须要username和password的验证 ...
- 通过JMeter来测试Quick Easy FTP Server的上传与下载性能
FTP性能测试 1.1背景说明 本测试选用的是一个小型的FTP服务器软件:Quick Easy FTP Server.Quick Easy FTP Server是一个全中文的FTP服务器软件,反应迅速 ...
随机推荐
- 如何在 Visual C# 中执行基本的文件 I/O
演示文件 I/O 操作 本文中的示例讲述基本的文件 I/O 操作.“分步示例”部分说明如何创建一个演示下列六种文件 I/O 操作的示例程序: 注意:如果要直接使用下列示例代码,请注意下列事项: 必须包 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- PHP中替换换行符的几种方法
PHP中替换换行的几种方法 参考脚本之家的文章:<PHP中替换换行符的几种方法小结>. 代码: 方法一: $replace_str = str_replace(array("\r ...
- Windows如何下载nginx软件包到linux系统虚拟机上
1.打开浏览器,输入“nginx下载官网” 2.点击nginx:download 3.找到你想下载的nginx软件包 4.点击你所需要的版本之后(我点击的是nginx-1.12.2版本,根据自己的需要 ...
- linux上开启和分析mysql慢查询日志
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- 安装 mysql odbc连接器
下载地址: https://dev.mysql.com/downloads/connector/odbc/ 可以选择旧版本的下载 一. 配置数据源 1. 安装后如果找不到软件可以按 win键 后 输 ...
- 安装nginx 以及nginx负载均衡
a 安装 [root@localhost ~]# yum -y install gcc automake autoconf libtool make yum install gcc gcc-c++ ...
- ESP8266-Soft AP模式 —— 谁想连上我
AP是Access Point简称,也就是访问接入点,是网络的中心节点.一般家庭的无线路由器就是一个AP,众多站点(STA)加入到它所组成的无线网络,网络中的所有的通信都通过AP来转发完成. 软AP也 ...
- vue作业1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结
考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...