最初是有一个需求,要求在程序中可以上传FTP附件,并也要吧从FTP下载附件,但公司不给FTP服务器,说是不安全,所以就想着在SAP服务器上建立一个FTP服务器,可最终还是原因安全问题不能搞FTP,
所以想在SAP服务器上安了SFTP,想着用代码操作SFTP,开始时想着操作SFTP应该与FTP是一样的,结果是不行的,网上找了很多资料,说来说去的一个办法都是SM69,客户端安装WINSCP的文件(此方法网上很多,自己找),但明显要每个操作的客户端都去安装一个软件是不大现实的,所以此法也行不通。
最后就想到的办法就是操作SAP目录的方法,以下是BASIS开放一个目录(多运用服务时,BASIS也得考虑),然后用ABAP上传文件到目录,并从目录中取文件的代码。
相关可能用到的事务码:
1.AL11,服务器上的文件
2.CG3Y 下载文件
3.CG3Z 上传文件
使用的主要函数为: C13Z_FILE_UPLOAD_BINARY ,C13Z_FILE_DOWNLOAD_BINARY ,大多时候,操作选择BIN类型
更多的操作细节也可以参考:
https://blog.csdn.net/champaignwolf/article/details/79279084
1.一、写文件到SAP目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
FUNCTION ZFILE_UPLOAD_TO_SERVER. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" REFERENCE(I_FTFRONT) TYPE RCGFILETR-FTFRONT DEFAULT *" 'd:\bac.txt' *" REFERENCE(I_FTAPPL) TYPE RCGFILETR-FTAPPL DEFAULT *" '/data/file/data/a.t' *" REFERENCE(I_FLG_OVERWRITE) TYPE RCGFILETR-IEFOW DEFAULT 'X' *" REFERENCE(I_FTFTYPE) TYPE RCGFILETR-FTFTYPE DEFAULT 'BIN' *" EXPORTING *" REFERENCE(X_FLG_STAY) TYPE FLAG *" REFERENCE(O_MSG) TYPE MSGTX *"---------------------------------------------------------------------- DATA: L_FLG_CONTINUE TYPE BOOLEAN. DATA: L_FLG_OPEN_ERROR TYPE BOOLEAN. DATA: L_OS_MESSAGE(100) TYPE C. DATA: L_TEXT1(40) TYPE C. DATA: L_TEXT2(40) TYPE C. * Function body ------------------------------------------------------- * upload the file IF I_FTFTYPE = 'ASC'. CALL FUNCTION 'C13Z_FILE_UPLOAD_ASCII' EXPORTING I_FILE_FRONT_END = I_FTFRONT I_FILE_APPL = I_FTAPPL I_FILE_OVERWRITE = I_FLG_OVERWRITE IMPORTING E_FLG_OPEN_ERROR = L_FLG_OPEN_ERROR E_OS_MESSAGE = L_OS_MESSAGE EXCEPTIONS FE_FILE_NOT_EXISTS = 1 FE_FILE_READ_ERROR = 2 AP_NO_AUTHORITY = 3 AP_FILE_OPEN_ERROR = 4 AP_FILE_EXISTS = 5 OTHERS = 6. ELSE. CALL FUNCTION 'C13Z_FILE_UPLOAD_BINARY' EXPORTING I_FILE_FRONT_END = I_FTFRONT I_FILE_APPL = I_FTAPPL I_FILE_OVERWRITE = I_FLG_OVERWRITE IMPORTING E_FLG_OPEN_ERROR = L_FLG_OPEN_ERROR E_OS_MESSAGE = L_OS_MESSAGE EXCEPTIONS FE_FILE_NOT_EXISTS = 1 FE_FILE_READ_ERROR = 2 AP_NO_AUTHORITY = 3 AP_FILE_OPEN_ERROR = 4 AP_FILE_EXISTS = 5 OTHERS = 6. ENDIF. IF SY-SUBRC <> 0. X_FLG_STAY = 'X'. CASE SY-SUBRC. WHEN 1. L_TEXT1 = I_FTFRONT(40). L_TEXT2 = I_FTFRONT+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2. * Datei &1&3 konnte nicht geöffnet werden WHEN 2. MESSAGE I156(C$) WITH I_FTFRONT. * Fehler beim Lesen/Schreiben der Datei &1 WHEN 3. MESSAGE I157(C$) WITH I_FTAPPL. * Sie haben keine Schreib-Berechtigung für die Datei &1 WHEN 4. L_TEXT1 = I_FTAPPL(40). L_TEXT2 = I_FTAPPL+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2. * Datei &1&3 konnte nicht geöffnet werden WHEN 5. * file already exists, ask if file can be overwritten CALL FUNCTION 'C14A_POPUP_ASK_FILE_OVERWRITE' IMPORTING E_FLG_CONTINUE = L_FLG_CONTINUE EXCEPTIONS OTHERS = 1. IF SY-SUBRC = 0 AND L_FLG_CONTINUE = 'X'. X_FLG_STAY = ''. CALL FUNCTION 'ZFILE_UPLOAD_TO_SERVER' EXPORTING I_FTFRONT = I_FTFRONT I_FTAPPL = I_FTAPPL I_FLG_OVERWRITE = X_FLG_STAY I_FTFTYPE = I_FTFTYPE IMPORTING X_FLG_STAY = X_FLG_STAY . ENDIF. WHEN OTHERS. MESSAGE I158(C$) WITH I_FTFRONT I_FTAPPL. * Fehler beim Transfer der Datei &1 nach &2 ENDCASE. ELSE. IF L_FLG_OPEN_ERROR = 'X'. X_FLG_STAY = 'X'. L_TEXT1 = I_FTAPPL(40). L_TEXT2 = I_FTAPPL+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2 INTO O_MSG. ELSE. MESSAGE S159(C$) WITH I_FTFRONT I_FTAPPL INTO O_MSG. ENDIF. ENDIF. ENDFUNCTION. |
2.二、从SAP目录下载文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
FUNCTION ZFILE_DOWNLOAD_FROM_SERVER. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" REFERENCE(I_FTFRONT) TYPE RCGFILETR-FTFRONT DEFAULT 'd:\aa.txt' *" REFERENCE(I_FTAPPL) TYPE RCGFILETR-FTAPPL DEFAULT *" '/data/file/data/a.t' *" REFERENCE(I_FLG_OVERWRITE) TYPE RCGFILETR-IEFOW DEFAULT 'X' *" REFERENCE(I_FTFTYPE) TYPE RCGFILETR-FTFTYPE DEFAULT 'BIN' *" EXPORTING *" REFERENCE(X_FLG_STAY) TYPE FLAG *"---------------------------------------------------------------------- DATA: L_FLG_CONTINUE TYPE BOOLEAN. DATA: L_FLG_OPEN_ERROR TYPE BOOLEAN. DATA: L_OS_MESSAGE(100) TYPE C. DATA: L_TEXT1(40) TYPE C. DATA: L_TEXT2(40) TYPE C. * Function body ------------------------------------------------------- * download the file IF I_FTFTYPE = 'ASC'. CALL FUNCTION 'C13Z_FILE_DOWNLOAD_ASCII' EXPORTING I_FILE_FRONT_END = I_FTFRONT I_FILE_APPL = I_FTAPPL I_FILE_OVERWRITE = I_FLG_OVERWRITE IMPORTING E_FLG_OPEN_ERROR = L_FLG_OPEN_ERROR E_OS_MESSAGE = L_OS_MESSAGE EXCEPTIONS FE_FILE_OPEN_ERROR = 1 FE_FILE_EXISTS = 2 FE_FILE_WRITE_ERROR = 3 AP_NO_AUTHORITY = 4 AP_FILE_OPEN_ERROR = 5 AP_FILE_EMPTY = 6 OTHERS = 7. ELSE. CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY' EXPORTING I_FILE_FRONT_END = I_FTFRONT I_FILE_APPL = I_FTAPPL I_FILE_OVERWRITE = I_FLG_OVERWRITE IMPORTING E_FLG_OPEN_ERROR = L_FLG_OPEN_ERROR E_OS_MESSAGE = L_OS_MESSAGE EXCEPTIONS FE_FILE_OPEN_ERROR = 1 FE_FILE_EXISTS = 2 FE_FILE_WRITE_ERROR = 3 AP_NO_AUTHORITY = 4 AP_FILE_OPEN_ERROR = 5 AP_FILE_EMPTY = 6 OTHERS = 7. ENDIF. IF SY-SUBRC <> 0. X_FLG_STAY = 'X'. CASE SY-SUBRC. WHEN 1. L_TEXT1 = I_FTFRONT(40). L_TEXT2 = I_FTFRONT+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2. * Datei &1&3 konnte nicht geöffnet werden WHEN 2. * file already exists, ask if file can be overwritten CALL FUNCTION 'C14A_POPUP_ASK_FILE_OVERWRITE' IMPORTING E_FLG_CONTINUE = L_FLG_CONTINUE EXCEPTIONS OTHERS = 1. IF SY-SUBRC = 0 AND L_FLG_CONTINUE = 'X'. X_FLG_STAY = ''. CALL FUNCTION 'ZFILE_DOWNLOAD_FROM_SERVER' EXPORTING I_FTFRONT = I_FTFRONT I_FTAPPL = I_FTAPPL I_FLG_OVERWRITE = 'X' I_FTFTYPE = I_FTFTYPE IMPORTING X_FLG_STAY = X_FLG_STAY . ENDIF. WHEN 3. MESSAGE I156(C$) WITH I_FTFRONT. * Fehler beim Lesen/Schreiben der Datei &1 WHEN 4. MESSAGE I157(C$) WITH I_FTAPPL. * Sie haben keine Lese-Berechtigung für die Datei &1 WHEN 5. L_TEXT1 = I_FTAPPL(40). L_TEXT2 = I_FTAPPL+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2. * Datei &1&3 konnte nicht geöffnet werden WHEN 6. MESSAGE I171(C$) WITH I_FTAPPL. * Die Datei &1 ist leer WHEN OTHERS. MESSAGE I158(C$) WITH I_FTAPPL I_FTFRONT. * Fehler beim Transfer der Datei &1 nach &2 ENDCASE. ELSE. IF L_FLG_OPEN_ERROR = 'X'. X_FLG_STAY = 'X'. L_TEXT1 = I_FTAPPL(40). L_TEXT2 = I_FTAPPL+40. MESSAGE I155(C$) WITH L_TEXT1 L_OS_MESSAGE L_TEXT2. * Datei &1&3 konnte nicht geöffnet werden * Datei &1 konnte nicht geöffnet werden ELSE. MESSAGE S159(C$) WITH I_FTAPPL I_FTFRONT. * Datei &1 wurde nach &2 übertragen ENDIF. ENDIF. ENDFUNCTION. |
3.三、调用例子
上传调用 ,
1 2 3 4 5 6 7 8 9 10 11 12 |
CALL FUNCTION 'ZFILE_UPLOAD_TO_SERVER' EXPORTING I_FTFRONT = L_FILE I_FTAPPL = L_SER_FILE I_FLG_OVERWRITE = 'X' I_FTFTYPE = 'BIN' IMPORTING X_FLG_STAY = L_ERR. IF L_ERR = 'X'. PERFORM FRM_DLOCK USING WA_ITAB. EXIT. ENDIF. |
下载调用
1 2 3 4 5 6 7 8 9 10 11 |
CALL FUNCTION 'ZFILE_DOWNLOAD_FROM_SERVER' EXPORTING I_FTFRONT = L_FILE I_FTAPPL = L_SER_FILE I_FLG_OVERWRITE = 'X' I_FTFTYPE = 'BIN' IMPORTING X_FLG_STAY = L_ERR. IF L_ERR = 'X'. EXIT. ENDIF. |