SE80: DDIC-Typ anlegen „ZFILESTREAM“
Feldname Name im Gateway ABAP-Typ Bemerkung
------------------------------------------------------------------------------------------------------------------
FILEKEY FileKey beliebig eindeutige Referenz (Key) zur späteren Ermittelung der Datei im Backend
MIME_TYPE MimeType CHAR100 Platzhalter für MimeType der Datei
VALUE Value XSTRINGVAL Platzhalter für Binärdaten
SEGW: neuer Entitätstyp zum Lesen der Datei
- Name: „FileStream“, DDIC-Typ „ZFILESTREAM“ importieren
Name Schlüssel EDM-Coretyp Bezeichner ABAP-Feldname
-------------------------------------------------------------------
FileKey ja Edm.String FileId FILEKEY
MimeType nein Edm.String Mimetyp MIME_TYPE
Value nein Edm.Binary Media Ressource VALUE
SE80: ZCL_…_MPC_EXT~DEFINE redefinieren
METHOD define.
DATA: lo_entity TYPE REF TO /iwbep/if_mgw_odata_entity_typ.
DATA: lo_property TYPE REF TO /iwbep/if_mgw_odata_property.
* Aufruf Basisklasse
super->define( ).
* Entität "FileStream" holen
lo_entity = model->get_entity_type( iv_entity_name = zcl_..._mpc=>gc_filestream ).
IF lo_entity IS BOUND.
* Feld für MimeType (==MIME_TYPE) als ContentType setzen
lo_property = lo_entity->get_property( iv_property_name = 'MimeType' ).
lo_property->set_as_content_type( ).
ENDIF.
ENDMETHOD.
SE80: /IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_STREAM redefinieren
METHOD /iwbep/if_mgw_appl_srv_runtime~get_stream.
DATA: lv_file TYPE zcl_..._mpc=>ts_filestream.
DATA: lv_stream TYPE ty_s_media_resource.
* Welche Entität?
CASE io_tech_request_context->get_entity_type_name( ).
WHEN zcl_..._mpc=>gc_filestream.
* Schlüssel ("FILEKEY") ermitteln
io_tech_request_context->get_converted_keys( IMPORTING es_key_values = lv_file ).
* gewünschte Binärdaten anhand des Schlüssels aus SAP lesen
DATA: it_bin_data TYPE STANDARD TABLE OF raw255.
it_bin_data = ...
* Dateinamen ermitteln
DATA: lv_filename TYPE skwf_filnm.
lv_filename = ...
* Für die Umwandlung die Dateigröße der Binärdaten berechnen
DATA(lv_size) = lines( it_bin_data ).
DATA: lv_line LIKE LINE OF it_bin_data.
DATA(lv_length) = 0.
* für Unicode-Kompatibilität IN BYTE MODE
DESCRIBE FIELD lv_line LENGTH lv_length IN BYTE MODE.
lv_size = lv_size * lv_length.
* Binärdaten in xstring für die Rückgabe konvertieren
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lv_stream-value
TABLES
binary_tab = it_bin_data
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc = 0.
* MIME-Typen der Datei ermitteln und an das Frontend übergeben
DATA: lv_mimetype TYPE skwf_mime.
* aus Dateinamen den MIME-Typen ermitteln
CALL FUNCTION 'SKWF_MIMETYPE_OF_FILE_GET'
EXPORTING
filename = lv_filename
IMPORTING
mimetype = lv_mimetype.
lv_stream-mime_type = lv_mimetype.
* HTTP-Header-Infos setzen (Dateiname usw.)
DATA(lv_lheader) = VALUE ihttpnvp( name = 'Content-Disposition'
value = |inline; filename="{ escape( val = lv_filename format = cl_abap_format=>e_url ) }";| ). " Datei im Tab inline (Plugin) öffnen
* value = |outline; filename="{ escape( val = lv_filename format = cl_abap_format=>e_url ) }";| ). " Datei zum direkten Herunterladen / Öffnen anbieten
set_header( is_header = lv_lheader ).
* alle Daten zum Frontend schicken
me->copy_data_to_ref( EXPORTING is_data = lv_stream
CHANGING cr_data = er_stream ).
ENDIF.
WHEN OTHERS.
* andere Entitäten standardmäßig behandeln
super->/iwbep/if_mgw_appl_srv_runtime~get_stream(
EXPORTING
iv_entity_name = iv_entity_name
iv_entity_set_name = iv_entity_set_name
iv_source_name = iv_source_name
it_key_tab = it_key_tab
it_navigation_path = it_navigation_path
io_tech_request_context = io_tech_request_context
IMPORTING
er_stream = er_stream
es_response_context = es_response_context ).
ENDCASE.
ENDMETHOD.
Weiterführende Infos: SAP Fiori tricks: Get rid of $value in PDF display/downloads