sap 与FTP 发送文件的例子 转载

本文详细介绍如何使用 SAP 系统通过 FTP 协议连接远程服务器并进行文件传输的操作步骤。包括测试连接、编写代码实现文件上传及下载等功能。提供了具体的函数调用示例和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
1.首先确定是否与FTP 能进行连接。(注意这里是sap 是否能进行连接)
方法: 用se38 先用 RSFTP002程序输入用户名,密码 和 host :ip地址 进行测试。
网上说明很多,但是没有写详细。command1 - 到 command3 先输入 command1 一个查询目录命令。
(别说不会,那就先查查ftp命令。)
返回的结果就知道是否连接成功。
1.5 为啥 是1.5 不是2 ? 如果不同就sm59 设置一下sapftp 或者自建一个zsapftp 。
2.连接成功就开始编写代码。可参考 上面的 RSFTP002 程序。
如果不会参考就算了,你不适合继续写这个程序了。
记住几个关键的函数(如下)。
1.call function 'HTTP_SCRAMBLE' "获取加密密码
exporting
source = ftp_pwd
sourcelen = dstlen
key = key "26101957 不能改
importing
destination = ftp_pwd.
2.call function 'FTP_CONNECT' "连接ftp服务器
exporting
user = ftp_user
password = ftp_pwd
host = ftp_host
rfc_destination = dest
importing
handle = hdl_1 "连接的句柄
exceptions
not_connected = 1
others = 2.
3. call function 'FTP_COMMAND' "执行FTP命令
exporting
handle = p_hdl_1 "连接句柄
command = l_ftpcommand "命令
tables
data = ftp_result "返回信息
exceptions
tcpip_error = 1
command_error = 2
data_error = 3
others = 4.
4. call function 'FTP_SERVER_TO_R3' "拷贝ftp服务器文件到r3
exporting
handle = hdl_1
fname = dest_filename
character_mode = 'X'
tables
text = itab_file.
5. call function 'FTP_COPY' "拷贝文件到指定位置
exporting
handle_source = hdl_1
handle_destination = hdl_2
file_source = dest_filename
file_destination = dest_filename
tables
data = ftp_result
exceptions
others = 1.
call function 'SCMS_TEXT_TO_BINARY'
importing
output_length = blob_length
tables
text_tab = itab_file
binary_tab = bindata
exceptions
failed = 1
others = 2.
PERFORM FRM_SET_INFORMATION_FOR_FTP.
*...连接到目标FTP 。
PERFORM FRM_CONNECT_FTP.
*..切换FTP 目录 到设备根目录
PERFORM FRM_SET_ROOT_DIRECTORY USING CNS_ROOT G_HANDLE
G_FTPCOMMAND G_FTPRETN.
*..创建批号文件夹 (日期+设备号+版本号)
PERFORM FRM_CREAT_BATCH_DIRECTORY USING P_EQUNR G_VERSION
G_FTPCOMMAND G_FTPRETN.
*..进入创建的目录 G_FTPDIR = ROOT+文件夹+'/'
PERFORM FRM_CHANGE_TO_BATDIRECTORY USING G_NEW_DIR G_ROOTDIR
G_FTPCOMMAND G_FTPRETN.
*..复制文件
PERFORM FRM_COPY_TO_FTP_SEVER USING P_EQUNR.
*..删除 flag0 文件,并上传flag1 文件。标识上传完成。
*...传输文件。
PERFORM FRM_UPDATE_FLAG_FILE USING G_NEW_DIR G_ROOTDIR
G_FTPCOMMAND G_FTPRETN.
*...断开连接
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
HANDLE = G_HANDLE.
FORM FRM_SET_INFORMATION_FOR_FTP.
IF **** 根据条件选择不同信息。
G_HOST = '***.**.88.**'.
* G_DEST = 'SAPFTP'. " 这个是根据设置里创建的连接来的,默认是SAPFTP
G_DEST = 'ZSAPFTP'.
G_USER = '**'. "FTP 连接用户名
G_PW = '***'. "密码
DESCRIBE FIELD G_PW LENGTH G_DSTLEN.
* ENDIF.
CALL 'AB_RFC_X_SCRAMBLE_STRING'
ID 'SOURCE' FIELD G_PW
ID 'KEY' FIELD CNS_KEY
ID 'SCR' FIELD 'X'
ID 'DESTINATION' FIELD G_PW
ID 'DSTLEN' FIELD G_DSTLEN.
*....此函数不写也能连上。4.6C 回报错。只好注释掉。
* CALL FUNCTION 'HTTP_SCRAMBLE'
* EXPORTING
* SOURCE = G_PW
* SOURCELEN = 9
* KEY = CNS_KEY
* IMPORTING
* DESTINATION = G_PW.
ENDFORM. " SET_INFORMATION_FOR_FTP
FORM FRM_CONNECT_FTP.
DO 3 TIMES." 连接三次,因为一次有可能会不成功
* OPEN THE FTP SERVER.
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
USER = G_USER
PASSWORD = G_PW
HOST = G_HOST
RFC_DESTINATION = G_DEST
IMPORTING
HANDLE = G_HANDLE
EXCEPTIONS
NOT_CONNECTED = 1
OTHERS = 2.
IF SY-SUBRC = 0.
EXIT.
ENDIF.
ENDDO.
IF SY-SUBRC <> 0.
*...连接失败删除已下载文件。
LOOP AT GT_DIREC INTO GS_DIREC.
*.....这里删除的是本地文件。还是附上代码是删除本级文件的form
*......例子是下载再传FTP,所以需要下载成本地文件
PERFORM FRM_DELET_FILES USING GS_DIREC-DIREC.
ENDLOOP.
REFRESH: GT_DIREC.
MESSAGE S000(0K) WITH '连接FTP服务器失败!请重试!'.
STOP.
ENDIF.
ENDFORM. " FRM_CONNECT_FTP
FORM FRM_DELET_FILES USING P_DIRECTORY.
DATA: L_RC TYPE I.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
EXPORTING
FILENAME = P_DIRECTORY
CHANGING
RC = L_RC
EXCEPTIONS
FILE_DELETE_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
FILE_NOT_FOUND = 4
ACCESS_DENIED = 5
UNKNOWN_ERROR = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " FRM_DELET_FILES
FORM FRM_SET_ROOT_DIRECTORY USING P_ROOT
P_HANDLE
P_COMMAND
P_RETURN.
CLEAR: P_COMMAND.
CONCATENATE 'cd' P_ROOT INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
G_ROOTDIR = P_ROOT.
ELSE.
CLEAR: G_ROOTDIR.
ENDIF.
ENDFORM. " FRM_SET_ROOT_DIRECTORY
FORM FRM_CREAT_BATCH_DIRECTORY USING P_EQUNR
P_VERSION
P_COMMAND
P_RETURN.
DATA: L_DIRNAME TYPE STRING.
CONCATENATE SY-DATUM P_EQUNR P_VERSION INTO L_DIRNAME.
CLEAR: P_COMMAND.
CONCATENATE 'mkdir' L_DIRNAME INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
CONCATENATE G_ROOTDIR L_DIRNAME '/' INTO G_FTPDIR.
G_NEW_DIR = L_DIRNAME.
ELSE.
CLEAR: G_FTPDIR.
ENDIF.
ENDFORM. " FRM_CREAT_BATCH_DIRECTORY
FORM FRM_CHANGE_TO_BATDIRECTORY USING P_DIRECT
P_DIR
P_COMMAND
P_RETURN.
CLEAR: P_COMMAND.
CONCATENATE 'cd' P_DIRECT INTO P_COMMAND SEPARATED BY SPACE.
PERFORM FRM_FTP_COMMAND USING P_COMMAND P_RETURN.
IF P_RETURN = 0.
CONCATENATE P_DIR P_DIRECT '/' INTO G_FTPDIR.
ELSE.
CLEAR: G_FTPDIR.
ENDIF.
ENDFORM. " FRM_CHANGE_TO_BATDIRECTORY
*..创建文件内容目录。
PERFORM FRM_CREATE_DIR_AND_ENTER USING G_FTPDIR
G_FTPCOMMAND G_FTPRETN.
PERFORM PROGRASS_BAR USING '文件复制中' '90'.
DATA: L_NAME TYPE STRING .
LOOP AT GT_DIREC INTO GS_DIREC.
CLEAR: L_NAME.
CONCATENATE GS_DIREC-FILEN GS_DIREC-VERSN GS_DIREC-FLTYP
INTO L_NAME.
PERFORM FRM_COPY_FILE USING GS_DIREC-DIREC L_NAME.
ENDLOOP.
FORM FRM_COPY_FILE USING P_SOURCE
P_DESTNAME.
DATA: LT_BINDATA TYPE TABLE OF BLOB WITH HEADER LINE.
DATA: BEGIN OF LT_FILE OCCURS 0,
LINE(512),
END OF LT_FILE.
DATA: L_SOURCE(30) TYPE C.
DATA: L_BLOB_LEN TYPE I.
L_SOURCE = P_SOURCE.
CALL FUNCTION 'SCMS_UPLOAD'
EXPORTING
FILENAME = L_SOURCE
BINARY = 'X'
IMPORTING
FILESIZE = L_BLOB_LEN
TABLES
DATA = LT_BINDATA
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
DATA: L_DEST_NAME TYPE RLGRAP-FILENAME .
L_DEST_NAME = P_DESTNAME.
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
HANDLE = G_HANDLE
FNAME = L_DEST_NAME
BLOB_LENGTH = L_BLOB_LEN
TABLES
* text = itab.
BLOB = LT_BINDATA.
ENDFORM. " FRM_COPY_FILE
后续继续补上代码。有不明白的地方,可以一起探讨。
<think>好的,我现在需要给用户介绍一下如何在SAP系统中编写将文件发送FTP服务器的代码。首先,我得回想一下SAP中处理FTP的相关函数和步骤。 用户可能希望了解整个流程,包括连接FTP、上传文件以及关闭连接。我记得SAP提供了函数模块来处理FTP操作,比如`FTP_CONNECT`用于建立连接,`FTP_COMMAND`执行命令,`FTP_DISCONNECT`关闭连接。但需要确认这些函数模块的正确性,可能还需要其他函数来处理文件上传。 接下来,文件上传可能需要将本地文件转换为二进制或字符格式,然后传输。可能需要使用`GUI_UPLOAD`读取本地文件,或者直接从应用服务器读取。然后使用`FTP_PUT`或者类似的函数上传文件。不过不确定函数名是否正确,可能需要查阅文档。 另外,要注意FTP服务器的认证信息,如用户名、密码、服务器地址和端口。这些信息应该在代码中安全处理,避免硬编码,可能使用SAP的安全存储方式。 还需要考虑错误处理,比如连接失败、文件不存在等情况,使用异常捕获或检查返回码。例如,在调用函数模块后检查SY-SUBRC是否为0。 可能的步骤是:1. 连接FTP服务器;2. 上传文件;3. 断开连接。每个步骤对应的函数需要明确,参数如何设置,例如被动模式、传输类型(ASCII或二进制)。 现在需要验证这些函数模块是否存在,比如`FTP_CONNECT`可能已被废弃,改用`SFTP_CONNECTION_OPEN`或其他?或者使用类`CL_HTTP_CLIENT`来处理?可能需要确认正确的函数。 如果使用较新的方法,可能涉及创建客户端实例,设置目标URI,然后发送请求。但用户明确提到FTP,所以应聚焦于FTP相关的函数模块。 另外,文件上传时可能需要使用`FTP_R3_TO_SERVER`,这个函数可以将ABAP内表的数据传输到FTP服务器。需要将文件内容读取到内表中,然后调用此函数。 总结步骤: 1. 读取要上传的文件到内表。 2. 建立FTP连接。 3. 执行上传命令。 4. 关闭连接。 需要检查每个步骤的具体函数和参数,确保示例代码正确。例如,使用`FTP_CONNECT`时,参数包括目标服务器、端口、用户名、密码等,返回一个句柄。然后使用`FTP_PUT`或`FTP_R3_TO_SERVER`上传文件内容,指定远程路径和文件名。最后用`FTP_DISCONNECT`关闭连接。 同时,处理可能的错误,比如连接失败或文件不存在,给出相应的错误消息。可能需要使用TRY...CATCH块或检查SY-SUBRC。 最后,提供一个完整的代码示例,并说明需要替换的参数部分,如服务器地址、用户名、密码、本地文件路径和远程路径。提醒用户注意权限和服务器配置,确保SAP应用服务器可以访问目标FTP服务器。</think>在SAP ABAP中实现文件传输到FTP服务器的操作,通常需使用以下函数模块及步骤: --- ### **核心函数模块** 1. **`FTP_CONNECT`** 建立FTP服务器的连接,需提供服务器地址、端口、用户名、密码。 2. **`FTP_COMMAND`** 执行FTP命令(如切换目录、设置传输模式)。 3. **`FTP_R3_TO_SERVER`** 将ABAP内表中的数据上传到FTP服务器。 4. **`FTP_DISCONNECT`** 关闭FTP连接。 --- ### **代码示例** ```abap REPORT z_ftp_upload. DATA: lv_handle TYPE i, " FTP连接句柄 lv_server TYPE string VALUE 'ftp.example.com', " FTP服务器地址 lv_username TYPE string VALUE 'user', " 用户名 lv_password TYPE string VALUE 'password', " 密码 lv_local_file TYPE string VALUE '/path/to/local/file.txt', " 本地文件路径 lv_remote_file TYPE string VALUE '/remote/path/file.txt', " 远程文件路径 lt_file_data TYPE TABLE OF string, " 存储文件内容的内表 lv_error TYPE string. START-OF-SELECTION. " 1. 读取本地文件到内表 CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = lv_local_file CHANGING data_tab = lt_file_data EXCEPTIONS file_open_error = 1 OTHERS = 2. IF sy-subrc <> 0. WRITE: '无法读取本地文件'. RETURN. ENDIF. " 2. 连接FTP服务器 CALL FUNCTION 'FTP_CONNECT' EXPORTING user = lv_username password = lv_password host = lv_server rfc_destination = ' ' " 直接连接,非通过RFC IMPORTING handle = lv_handle EXCEPTIONS not_connected = 1 OTHERS = 2. IF sy-subrc <> 0. WRITE: 'FTP连接失败'. RETURN. ENDIF. " 3. 可选:切换远程目录(如需要) CALL FUNCTION 'FTP_COMMAND' EXPORTING handle = lv_handle command = 'cd /remote/path' EXCEPTIONS command_error = 1 OTHERS = 2. IF sy-subrc <> 0. WRITE: '切换目录失败'. ENDIF. " 4. 上传文件FTP服务器 CALL FUNCTION 'FTP_R3_TO_SERVER' EXPORTING handle = lv_handle fname = lv_remote_file data_type = 'ASC' " ASCII模式,二进制用 'BIN' TABLES text = lt_file_data EXCEPTIONS tcpip_error = 1 command_error = 2 data_error = 3 OTHERS = 4. IF sy-subrc <> 0. WRITE: '文件上传失败'. ELSE. WRITE: '文件上传成功'. ENDIF. " 5. 断开FTP连接 CALL FUNCTION 'FTP_DISCONNECT' EXPORTING handle = lv_handle. ``` --- ### **关键注意事项** 1. **权限配置** - 确保SAP应用服务器能够访问目标FTP服务器的21端口(或自定义端口)。 - 在SAP系统参数中配置允许外部连接。 2. **文件路径** - 本地文件路径需为SAP应用服务器可直接访问的路径(如服务器本地路径或共享目录)。 3. **错误处理** - 使用`SY-SUBRC`检查每一步操作是否成功。 - 建议添加`TRY...CATCH`块或详细异常处理逻辑。 4. **安全增强** - 避免在代码中硬编码密码,改用SAP安全存储(如`SECSTORE`)或通过参数动态获取。 --- ### **替代方案** 若需更现代的实现方式,可考虑: - 使用类`CL_HTTP_CLIENT`通过SFTP协议传输(需服务器支持SSH)。 - 调用外部工具(如`lftp`)通过`CALL SYSTEM`命令执行(需操作系统权限)。 建议根据实际服务器环境选择合适方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值