[go: up one dir, main page]

0% found this document useful (0 votes)
105 views13 pages

How To Upload Document

This document defines a class called ZCL_FILE_UPLOAD that handles file uploads. It contains methods to upload files, get file details, and create attachments from uploaded files. The class implements the IF_HTTP_EXTENSION interface to handle HTTP requests for file uploads and returns a response.

Uploaded by

ilam1510
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
105 views13 pages

How To Upload Document

This document defines a class called ZCL_FILE_UPLOAD that handles file uploads. It contains methods to upload files, get file details, and create attachments from uploaded files. The class implements the IF_HTTP_EXTENSION interface to handle HTTP requests for file uploads and returns a response.

Uploaded by

ilam1510
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 13

CLASS zcl_file_upload DEFINITION

PUBLIC
FINAL
CREATE PUBLIC .

PUBLIC SECTION.

INTERFACES if_http_extension .

CLASS-METHODS class_constructor .
PROTECTED SECTION.
private section.

constants FILENAME type STRING value 'filename=' ##NO_TEXT.


constants FILECONTENT type STRING value 'content-type' ##NO_TEXT.
constants FILELENGTH type STRING value 'Content-Length:' ##NO_TEXT.
class-data CRLFLENGTH type I .
data MT_UPLOADED type STRING_TABLE .

methods UPLOAD_RESPONSE
importing
!SERVER type ref to IF_HTTP_SERVER .
methods RESPONSE
importing
!SERVER type ref to IF_HTTP_SERVER .
methods GET_FILE_DETAIL
importing
!IV_CONTENT type STRING
exporting
!EV_FILENAME type STRING

!EV_FILETYPE type STRING


!EV_LENGTH type INT4
!EV_CONTENT type XSTRING .
methods GET_FILE_CONTENT
importing
!IV_SUBSTR type STRING
!IV_FILETYPE type STRING
exporting
!EV_LENGTH type INT4
!EV_CONTENT type XSTRING .
methods CREATE_ATTACHMENT
importing
!IV_DATA type XSTRING
!IV_GUID type STRING
!IV_FILE_NAME type STRING
!IV_FILE_TYPE type STRING
!IV_BOR_TYPE type STRING .
ENDCLASS.

CLASS ZCL_FILE_UPLOAD IMPLEMENTATION.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_FILE_UPLOAD=>CLASS_CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD class_constructor.
crlflength = strlen( cl_abap_char_utilities=>cr_lf ).

ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_FILE_UPLOAD->CREATE_ATTACHMENT
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DATA

TYPE

XSTRING

* | [--->] IV_GUID

TYPE

STRING

* | [--->] IV_FILE_NAME
* | [--->] IV_FILE_TYPE

TYPE
TYPE

* | [--->] IV_BOR_TYPE

TYPE

STRING
STRING
STRING

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD create_attachment.
DATA:
ls_bo

TYPE sibflporb,

ls_prop

TYPE LINE OF sdokproptys,

lt_prop

TYPE sdokproptys,

lt_properties_attr TYPE crmt_attr_name_value_t,


ls_file_info

TYPE sdokfilaci,

lt_file_info

TYPE sdokfilacis,

lt_file_content
lv_length
lv_file_xstring
ls_loio

TYPE sdokcntbins,
TYPE i,
TYPE xstring,

TYPE skwf_io,

ls_phio

TYPE skwf_io,

ls_error

TYPE skwf_error.

ls_prop-name = 'DESCRIPTION'.
ls_prop-value = iv_file_name.
APPEND ls_prop TO lt_prop.

ls_prop-name = 'KW_RELATIVE_URL'.
ls_prop-value = iv_file_name.
APPEND ls_prop TO lt_prop.

ls_prop-name = 'LANGUAGE'.
ls_prop-value = sy-langu.
APPEND ls_prop TO lt_prop.

lv_file_xstring = iv_data.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer

= lv_file_xstring

IMPORTING
output_length = lv_length
TABLES
binary_tab

= lt_file_content.

ls_file_info-binary_flg = 'X'.
ls_file_info-file_name = iv_file_name.
ls_file_info-file_size = lv_length.
ls_file_info-mimetype = iv_file_type.
APPEND ls_file_info TO lt_file_info.

ls_bo-instid = iv_guid.
ls_bo-typeid = iv_bor_type.
ls_bo-catid = 'BO'.

CALL METHOD cl_crm_documents=>create_with_table


EXPORTING

business_object
properties

= ls_bo
= lt_prop

properties_attr

= lt_properties_attr

file_access_info

= lt_file_info

file_content_binary = lt_file_content
raw_mode

= 'X'

IMPORTING
loio

= ls_loio

phio

= ls_phio

error

= ls_error.

ASSERT ls_error IS INITIAL.


ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_FILE_UPLOAD->GET_FILE_CONTENT
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_SUBSTR

TYPE

STRING

* | [--->] IV_FILETYPE

TYPE

STRING

* | [<---] EV_LENGTH
* | [<---] EV_CONTENT

TYPE
TYPE

INT4
XSTRING

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_file_content.
DATA: lt_result

TYPE string_table,

lt_result_tab TYPE match_result_tab,


ls_result

LIKE LINE OF lt_result_tab,

lv_sub

TYPE string,

lv_offset

TYPE i,

lv_digit

TYPE c,

lv_index

TYPE i,

lv_offset2

TYPE i,

lv_len

TYPE i,

l_conv

TYPE REF TO cl_abap_conv_out_ce.

FIELD-SYMBOLS: <hex> TYPE x.


SPLIT iv_substr AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_result.

READ TABLE lt_result INTO lv_sub INDEX 1.

FIND filelength IN lv_sub MATCH OFFSET lv_offset.

lv_len = strlen( filelength ).

lv_offset = lv_offset + lv_len.


lv_len = strlen( lv_sub ) - lv_len.

lv_sub = lv_sub+lv_offset(lv_len).

CONDENSE lv_sub.

ev_length = lv_sub.

FIND FIRST OCCURRENCE OF cl_abap_char_utilities=>cr_lf IN iv_substr MATCH


OFFSET lv_offset.
FIND ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN iv_substr RESULTS
lt_result_tab.
READ TABLE lt_result_tab INTO ls_result INDEX lines( lt_result_tab ).

lv_len = ls_result-offset - lv_offset - crlflength.


lv_offset = lv_offset + crlflength.

lv_sub = iv_substr+lv_offset(lv_len).
CLEAR: ev_content.
DO lv_len TIMES.
lv_index = sy-index - 1.
lv_digit = lv_sub+lv_index(1).
ASSIGN lv_digit TO <hex> CASTING.
CONCATENATE ev_content <hex>(1) INTO ev_content IN BYTE MODE.
ENDDO.

ASSERT xstrlen( ev_content ) = ev_length.

ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_FILE_UPLOAD->GET_FILE_DETAIL
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_CONTENT

TYPE

STRING

* | [<---] EV_FILENAME

TYPE

STRING

* | [<---] EV_FILETYPE

TYPE

STRING

* | [<---] EV_LENGTH

TYPE

INT4

* | [<---] EV_CONTENT

TYPE

XSTRING

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_file_detail.
DATA: lv_offset1 TYPE int4,
lv_offset2 TYPE int4,
lv_len

TYPE int4,

lv_sub

TYPE string,

lv_sub2

TYPE string.

FIND FIRST OCCURRENCE OF filename IN iv_content MATCH OFFSET lv_offset1.


FIND FIRST OCCURRENCE OF filecontent IN iv_content MATCH OFFSET lv_offset2.

lv_len = lv_offset2 - lv_offset1 - strlen( filecontent ) + 1.

lv_offset1 = lv_offset1 + strlen( filename ).


lv_sub = iv_content+lv_offset1(lv_len).
REPLACE ALL OCCURRENCES OF '"' IN lv_sub WITH space.
CONDENSE lv_sub.

ev_filename = lv_sub.

FIND FIRST OCCURRENCE OF filelength IN iv_content MATCH OFFSET lv_offset1.


lv_len = lv_offset1 - lv_offset2 - strlen( filelength ) - 2.
lv_offset2 = lv_offset2 + strlen( filecontent ) + 1.
lv_sub = iv_content+lv_offset2(lv_len).
CONDENSE lv_sub.

ev_filetype = lv_sub.

lv_len = strlen( iv_content ) - lv_offset1.


lv_sub2 = iv_content+lv_offset1(lv_len).

CALL METHOD get_file_content


EXPORTING
iv_substr = lv_sub2
iv_filetype = ev_filetype
IMPORTING
ev_length = ev_length

ev_content = ev_content.
ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_FILE_UPLOAD>IF_HTTP_EXTENSION~HANDLE_REQUEST
* +-------------------------------------------------------------------------------------------------+
* | [--->] SERVER

TYPE REF TO IF_HTTP_SERVER

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD if_http_extension~handle_request.

DATA: lt_form

TYPE tihttpnvp,

lv_data

TYPE string,

lv_boundary

TYPE string,

lv_content_type TYPE string,


lv_filename

TYPE string,

lt_result

TYPE string_table,

lv_line

TYPE string,

lv_uuid

TYPe string,

lv_filelength TYPE i,
lv_filecontent TYPE xstring,
lv_filetype

TYPE string.

lv_content_type = server->request->get_header_field( 'content-type' ).


lv_uuid = server->request->get_form_field( 'uuid' ).
SPLIT lv_content_type AT 'boundary=' INTO TABLE lt_result.
READ TABLE lt_result INTO lv_boundary INDEX 2.
server->request->get_form_fields( CHANGING fields = lt_form ).
lv_data = server->request->get_cdata( ).

SPLIT lv_data AT lv_boundary INTO TABLE lt_result.


LOOP AT lt_result INTO lv_line WHERE table_line CS filelength.
CALL METHOD get_file_detail
EXPORTING
iv_content = lv_line
IMPORTING
ev_filename = lv_filename
ev_filetype = lv_filetype
ev_length = lv_filelength
ev_content = lv_filecontent.

CALL METHOD create_attachment


EXPORTING
iv_data = lv_filecontent
iv_guid = lv_uuid
iv_file_name = lv_filename
iv_file_type = lv_filetype
iv_bor_type = 'BUS1178'.

APPEND lv_filename TO mt_uploaded.

ENDLOOP.

upload_response( server ).
ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_FILE_UPLOAD->RESPONSE

* +-------------------------------------------------------------------------------------------------+
* | [--->] SERVER

TYPE REF TO IF_HTTP_SERVER

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD response.
DATA: lv_input_str TYPE string,
lv_html
lt_scarr

TYPE string,
TYPE TABLE OF scarr.

FIELD-SYMBOLS:
<fs_scarr> TYPE scarr.

lv_input_str = server->request->get_form_field( 'query' ).

SELECT * FROM scarr INTO TABLE lt_scarr.

IF strlen( lv_input_str ) > 0.


LOOP AT lt_scarr ASSIGNING <fs_scarr>.
FIND lv_input_str IN <fs_scarr>-carrname IGNORING CASE.
CHECK sy-subrc = 0.
IF strlen( lv_html ) = 0.
CONCATENATE `<a href=` <fs_scarr>-url ` target=_blank>`
<fs_scarr>-carrname `</a>` INTO lv_html.
ELSE.
CONCATENATE lv_html `<br />` `<a href=` <fs_scarr>-url `
target=_blank>`
<fs_scarr>-carrname `</a>` INTO lv_html.

ENDIF.
ENDLOOP.
ENDIF.

IF strlen( lv_html ) = 0.
lv_html = '&lt;no suggestion&gt;'.
ENDIF.

server->response->set_cdata( lv_html ).
server->response->set_header_field( name = 'Access-Control-Allow-Origin' value
= '*' ).
ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_FILE_UPLOAD->UPLOAD_RESPONSE
* +-------------------------------------------------------------------------------------------------+
* | [--->] SERVER

TYPE REF TO IF_HTTP_SERVER

* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD UPLOAD_RESPONSE.
DATA: lv_str TYPE string,
lv_html

TYPE string.

LOOP AT mt_uploaded INTO lv_str.


CONCATENATE lv_html `<p>File uploaded successfully: ` lv_str `</p>` INTO
lv_html.
ENDLOOP.

IF strlen( lv_html ) = 0.
lv_html = '&lt;no file uploaded&gt;'.
ENDIF.

server->response->set_cdata( lv_html ).

server->response->set_header_field( name = 'Access-Control-Allow-Origin' value


= '*' ).
ENDMETHOD.
ENDCLASS.

You might also like