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
- Haken bei Medium setzen
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