SAP/ABAP 코드

(ABAP 코드) 첨부파일 업로드&다운로드

haramang 2022. 2. 8. 11:01

"첨부파일 스크린400
DATA BEGIN OF gs_disp2,
      
icon TYPE icon-id"상태
     bukrs 
TYPE zjjy_attach-bukrs"회사코드
    belnr  
TYPE zjjy_attach-belnr"전표번호
    gjahr  
TYPE zjjy_attach-gjahr"회계연도
  filename 
TYPE zjjy_attach-filename"파일명
     zfile 
TYPE zjjy_attach-zfile"파일업로드
    erdat  
TYPE zjjy_attach-erdat"생성일
    ernam  
TYPE zjjy_attach-ernam"생성자
    erzet  
TYPE zjjy_attach-erzet"생성시간
    mark 
TYPE c"삭제플래그
    
END OF gs_disp2.
DATA gt_disp2 LIKE TABLE OF gs_disp2.
DATA gt_disp2_old LIKE TABLE OF gs_disp2. 

 

 

***************************************************************

첨부파일 업로드 로직

 DATA files TYPE filetable"파일업로드시파일경로
  
DATA filename TYPE LINE OF filetable"파일경로 - 라인타입
  
DATA rc TYPE i"리턴코드 - 파일수량

  
DATA filename2 TYPE string"파일경로 - 다른펑션호출을위한 타입이동

  
DATA g_len TYPE i"파일길이

  
TYPES text_data(4096TYPE c"4096 캐릭터타입 변수선언
  
DATA l_raw_data TYPE TABLE OF text_data"4096캐릭타입 테이블

  
DATA xstr_content TYPE xstring"업로드데이터 2진형식변환

  
DATA f_name TYPE rlgrap-filename"파일명

  
DATA lv_extension    TYPE c LENGTH 30"파일명-파일명

***************************************************************

  
CLEAR gs_disp2.
  
CLEAR filesfilename.

파일업로드 선택창 팝업
  
CALL METHOD cl_gui_frontend_services=>file_open_dialog
    
EXPORTING
      window_title      
'파일 업로드"선택창 이름
      default_filename  
'' "파일 기본이름
      file_filter       
'' "파일 확장필터
    
CHANGING
      file_table        
files "선택한 파일의 위치
      rc                
rc"리턴코드

  
"취소눌러서 파일없을때 나가기
  
CHECK files IS NOT INITIAL.

  
READ TABLE files INTO filename INDEX 1.
  filename2 
filename"타입이동 (filetable -> string)

파일경로주고 파일명 얻기.
  
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
    
EXPORTING
      full_name     
filename2 "파일경로
    
IMPORTING
      stripped_name 
f_name "파일명
    
EXCEPTIONS
      x_error       
1
      
OTHERS        2.

파일명/확장자 분할
  
CALL FUNCTION 'TRINT_FILE_GET_EXTENSION'
    
EXPORTING
      filename        
f_name
*   UPPERCASE       = 'X'
   
IMPORTING
     extension       
lv_extension.

  
"확장자 구버전엑셀이면 안받는다.
  
IF lv_extension 'XLS'.
    
MESSAGE s000 WITH text-m14 DISPLAY LIKE 'E'"업로드 불가-구버전엑셀
    
EXIT.
  
ENDIF.

동일자료 존재여부 확인
  
READ TABLE gt_disp2 INTO gs_disp2 WITH KEY filename f_name.

  
"중복 안받는다.
  
IF sy-subrc 0.
    
MESSAGE s000 WITH text-m10 DISPLAY LIKE 'E'"업로드불가-중복
    
EXIT.
  
ENDIF.

업로드파일 데이터 테이블에 담기
  
CALL FUNCTION 'GUI_UPLOAD'
    
EXPORTING
      filename                
filename2
      filetype                
'BIN'
    
IMPORTING
      filelength              
g_len
    
TABLES
      data_tab                
l_raw_data
    
EXCEPTIONS
      file_open_error         
1
      file_read_error         
2
      no_batch                
3
      gui_refuse_filetransfer 
4
      invalid_type            
5
      no_authority            
6
      unknown_error           
7
      bad_data_format         
8
      header_not_allowed      
9
      separator_not_allowed   
10
      header_too_long         
11
      unknown_dp_error        
12
      access_denied           
13
      dp_out_of_memory        
14
      disk_full               
15
      dp_timeout              
16
      
OTHERS                  17.

  
IF sy-subrc <> 0.
*    MESSAGE '파일을 업로드할  없습니다.' TYPE 'E'.
    
MESSAGE s000 WITH text-m18 DISPLAY LIKE 'E'"파일을 업로드할  없습니다
    
EXIT.
  
ENDIF.

업로드데이터 -> 2진데이터 변환
  
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    
EXPORTING
      input_length       
g_len
   
IMPORTING
     
buffer             =  xstr_content
    
TABLES
      binary_tab         
l_raw_data
   
EXCEPTIONS
     failed             
1
     
OTHERS             2
            
.
  
IF sy-subrc <> 0.
    
MESSAGE 'Unable to convert binary to xstring' TYPE 'E'.
  
ENDIF.

***************************************************************

  
"유효성검사완료 "데이터 넣기
  gs_disp2
-filename f_name"파일명
  gs_disp2
-zfile xstr_content"파일데이터
  gs_disp2
-erdat sy-datum"생성일
  gs_disp2
-ernam sy-uname"생성자
  gs_disp2
-erzet sy-uzeit"생성시간

  
"파일확장자에 따른 아이콘처리
  
"엑셀일때
  
IF lv_extension 'XLSX'.
    gs_disp2
-icon icon_xls.

    
"PDF일때
  
ELSEIF lv_extension 'PDF'.
    gs_disp2
-icon icon_pdf.

    
"JPG일때
  
ELSEIF lv_extension 'JPG'.
    gs_disp2
-icon icon_jpg.

    
"GIF일때
  
ELSEIF lv_extension 'GIF'.
    gs_disp2
-icon icon_gif.

    
"PPT일때
  
ELSEIF lv_extension 'PPTX'.
    gs_disp2
-icon icon_ppt.

    
"DOC일때
  
ELSEIF lv_extension 'DOC' OR lv_extension 'DOCX'.
    gs_disp2
-icon icon_doc.

    
" 
  
ELSE.
    gs_disp2
-icon icon_public_files.

  
ENDIF.

  
APPEND gs_disp2 TO gt_disp2.

 

 

***************************************************************

첨부파일 다운로드 로직

 DATA filename TYPE string"파일경로
  
DATA down_filename TYPE string"다운파일이름

  
DATA lv_filename     TYPE string"파일명-확장자
         lv_extension    
TYPE string"파일명-파일명

  
TYPES text_data(4096TYPE c"4096 캐릭터타입 변수선언
  
DATA l_raw_data TYPE TABLE OF text_data"4096캐릭타입 테이블

*  DATA: l_raw_data TYPE truxs_t_text_data WITH HEADER LINE.

  
DATA lv_path         TYPE string"경로
         lv_fullpath     
TYPE string"전체경로

*************************************************************

  
CLEAR l_raw_datafilename"캐릭터타입테이블/파일경로 초기화

* 2진데이터 -> 업로드데이터 변환
  
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
   
EXPORTING
     
buffer gs_disp2-zfile
   
TABLES
    binary_tab 
l_raw_data"업로드데이터

  filename 
gs_disp2-filename"파일명

파일명/확장자 분할
  
SPLIT filename AT '.' INTO lv_filename lv_extension.

  down_filename 
'DOWN_' && lv_filename.

파일다운로드 선택창 팝업
  
CALL METHOD cl_gui_frontend_services=>file_save_dialog
    
EXPORTING
      default_extension 
lv_extension "기본확장자
      default_file_name 
down_filename "파일명
    
CHANGING
      filename          
filename "다운받을이름
      path              
lv_path "경로
      fullpath          
lv_fullpath"전체경로

업로드데이터와 경로줘서 다운받기
  
CALL FUNCTION 'GUI_DOWNLOAD'
    
EXPORTING
      filename                        
lv_fullpath
      filetype                        
'BIN'
    
TABLES
      data_tab                        
l_raw_data.
  
.

다운받은 파일 바로 실행
  
CALL METHOD cl_gui_frontend_services=>execute
    
EXPORTING
     document               
lv_fullpath "파일경로
     operation              
'OPEN' "실행
    
EXCEPTIONS
     cntl_error             
1
     error_no_gui           
2
     bad_parameter          
3
     file_not_found         
4
     path_not_found         
5
     file_extension_unknown 
6
     error_execute_failed   
7
     synchronous_failed     
8
     not_supported_by_gui   
9
    
OTHERS                 10
  
.