如何在SAP Gateway Server中正确实现文件上传方法CREATE_STREAM

2020-09-03 09:10发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家早上好 又是另一个问题...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家早上好

又是另一个问题,我需要这里的所有专家帮助。 几天以来,我一直在尝试熟悉SAP Gateway OData的文件上传和作为服务下载。 我在这里阅读了两个博客,从那里我可以收集到一些知识。 非常感谢那些作者,如果没有他们的投入,我将完全失去。 这个特定的博客是HELPFUL =>

通过NetWeaver Gateway上传/下载文件

作者在那里使用UPDATE_STREAM方法将文件上传到SAP后端系统。 我使用他的方法,效果很好。 现在我很好奇,想知道是否可以尝试实现CREATE_STREAM方法,该方法实际上是用于CREATE(UPLOAD)一个新文件的方法。 在此之前,我创建了一个名为" ZZUPLD"的透明表来存储上载的文件。 这是该表的屏幕截图,共有6个字段,其中最重要的是FILENAME,MIMETYPE和VALUE

(52.8 kB)
3条回答
Tong__Ming
2020-09-03 09:43

在我们的上载和下载过程中,我们将使用SAP Gateway OData服务。 这些文件将存储在必须定义的数据库表中。

在我们的例子中,数据库表总共有6个字段:MANDT,FILENAME,SYDATE,SYTIME,VALUE,MIMETYPE。 在相应的

中查看其数据类型

屏幕截图。 以下过程由SEVEN(7)步骤组成,这里的其他博客帮助我做到了,感谢所有作者,尤其是Ugur Kaya

1-创建将存储文件的数据库表(请参见屏幕截图)

2-在SEGW中创建项目,并创建名为"文件"的实体类型。 您可以选择另一个名称。 自我们

以来,该实体类型必须标记为MEDIA。

要使用媒体资源(二进制数据,例如IMAGE,VIDEO等)进行DEAL。 查看屏幕截图。

当您将实体类型定义为MEDIA类型时,该实体类型应具有一个属性,该属性将存储您的媒体资源的MIME TYPE。

在这种情况下,名为" File"的实体类型将具有STRING类型的两个属性:FileName(类型字符串),MIMEType(类型字符串)。

在这种情况下,属性" FileName"是KEY属性。 查看截图

3-您必须指定哪个Entity type属性存储MIME TYPE。 这是通过CLASS方法" DEFINE"的重新定义来完成的

MPC_EXT

定义方法。

"当将实体类型定义为'media'时,我们必须在此DEFINE方法中定义哪个属性

实体类型的

"存储MIME类型。这是必须做的

数据:/iwbep/if_mgw_odata_entity_typ的lo_entity_type类型引用,

lo_property类型参考/iwbep/if_mgw_odata_property。

"首先调用超类方法!!!

super-> define()。

"检索实体类型并将其存储在lo_entity_type中

lo_entity_type =模型-> get_entity_type('文件')。

如果lo_entity_type已绑定。

"检索相应的实体类型属性并将其存储在lo_property中

lo_property = lo_entity_type-> get_property('MIMEType')。

"现在使用方法'set_as_content_type()'将lo_property设置为MIME TYPE

lo_property-> set_as_content_type()。

ENDIF。

终止方法。

4-在这里,我们将重新定义方法'FILESET_GET_ENTITY'。 文件成功成功后,将从方法CREATE_STREAM中调用此方法

上载到数据库表。 将在下面重新定义的方法CREATE_STREAM将文件上载到数据库表,然后

它将FileName和MIMEType传递给方法FILESET_GET_ENTITY,这将填充导出参数'ER_ENTITY'

方法fileset_get_entity。

**尝试。

*超级呼叫方法-> FILESET_GET_ENTITY

*导出

* IV_ENTITY_NAME =

* IV_ENTITY_SET_NAME =

* IV_SOURCE_NAME =

* IT_KEY_TAB =

** io_request_object =

** io_tech_request_context =

* IT_NAVIGATION_PATH =

**导入

** er_entity =

** es_response_context =

*。

**捕获/iwbep/cx_mgw_busi_exception。

**捕获/iwbep/cx_mgw_tech_exception。

**尝试。

"主要思想是返回FileName和MIMEType。将在CREATE_STREAM中调用此方法

"方法。必要的参数将通过IT_KEY_TAB

传递

数据:lv_filename类型的字符串,

lv_mimetype类型字符串。

字段符号类型/iwbep/s_mgw_name_value_pair。

数据ls_file类型zzupld。

"从it_key_tab中读取参数

读取表it_​​key_tab分配键名称='FileName'的

如果sy-subrc = 0。

lv_filename = -值。

endif。

读取表it_​​key_tab分配键名称='MIMEType'的

如果sy-subrc = 0。

lv_mimetype = -值。

endif。

"首先请确保lv_filename和lv_mimetype不是初始的

如果lv_filename不是初始的并且lv_mimetype不是初始的。

"现在读取从数据库表中读取条目

从zzupld中选择单个*到ls_file中,其中filename = lv_filename和mimetype = lv_mimetype。

如果sy-subrc = 0。

"该条目已找到,现在您可以相应地填写er_entity

er_entity-filename = ls_file-filename。

er_entity-mimetype = ls_file-mimetype。

endif。

endif。

终止方法。

5-重新定义方法CREATE_STREAM。 这是执行"上传过程"的方法。

方法/iwbep/if_mgw_appl_srv_runtime〜create_stream。

**尝试。

*超级呼叫方法->/IWBEP/IF_MGW_APPL_SRV_RUNTIME〜CREATE_STREAM

*导出

** iv_entity_name =

** iv_entity_set_name =

** iv_source_name =

* IS_MEDIA_RESOURCE =

** it_key_tab =

** it_navigation_path =

* IV_SLUG =

** io_tech_request_context =

**导入

** er_entity =

*。

**捕获/iwbep/cx_mgw_busi_exception。

**捕获/iwbep/cx_mgw_tech_exception。

**尝试。

"该方法实际上执行文件UPLOAD过程。插入HTTP POST请求中的文件

"必须保存在为其预先定义的透明表中。表名称为" ZZUPLD",由以下内容组成

" 6个字段:MANDT,FILENAME,SYDATE,SYTIME,VALUE,MIMETYPE。除了MANDT字段已填充

"自动地,其他5个字段必须在此处相应填写

数据:ls_file类型zzupld

" ---------------------------新数据定义---------------- -------------------------------------------

数据:ls_key_tab类型/iwbep/s_mgw_name_value_pair,

lt_key_tab类型/iwbep/t_mgw_name_value_pair,

ls_filemetadata的开始,

文件名类型字符串,

mimetype类型字符串,

ls_filemetadata的结尾。

" ---------------------------新数据定义---------------- -------------------------------------------

"现在相应地填充ls_file

ls_file-filename = iv_slug。

ls_file-sydate = sy-datum。

ls_file-sytime = sy-uzeit。

ls_file-mimetype = is_media_resource-mime_type。

ls_file-value = is_media_resource-value。

" ---------------------------新代码----------------- --------------------------------------------

"想法是使用ls_key_tab用文件名和mimetype填充lt_key_tab

ls_key_tab-name ='FileName'。

ls_key_tab-value = iv_slug。

将ls_key_tab附加到lt_key_tab。

ls_key_tab-name ='MIMEType'。

ls_key_tab-value = is_media_resource-mime_type。

将ls_key_tab附加到lt_key_tab。

"归档将存储文件元数据的结构:文件名,MIME类型

将iv_slug移至ls_filemetadata文件名。

将is_media_resource-mime_type移到ls_filemetadata-mimetype。

" ---------------------------新代码----------------- --------------------------------------------

"现在将文件添加到透明表中

从ls_file修改zzupld。

如果sy-subrc = 0。

"现在调用FILESET_GET_ENTITY方法

fileset_get_entity(

导出

iv_entity_name = iv_entity_name

iv_entity_set_name = iv_entity_set_name

iv_source_name = iv_source_name

it_key_tab = lt_key_tab

* io_request_object =

* io_tech_request_context =

it_navigation_path = it_navigation_path

导入

er_entity = ls_file元数据

* es_response_context =

)。

"相应地填充导出参数er_entity

copy_data_to_ref(

导出

is_data = ls_filemetadata

更改

cr_data = er_entity

endif。

终止方法。

6-重新定义方法GET_STREAM执行文件下载

方法/iwbep/if_mgw_appl_srv_runtime〜get_stream。

**尝试。

*超级呼叫方法->/IWBEP/IF_MGW_APPL_SRV_RUNTIME〜GET_STREAM

**导出

** iv_entity_name =

** iv_entity_set_name =

** iv_source_name =

** it_key_tab =

** it_navigation_path =

** io_tech_request_context =

**导入

** er_stream =

** es_response_context =

*。

**捕获/iwbep/cx_mgw_busi_exception。

**捕获/iwbep/cx_mgw_tech_exception。

**尝试。

" GET_STREAM方法用于将文件从SAP后端系统下载到外部目标存储库

"首先定义必要的数据。" UPLD"代表UPLOAD

数据:ls_stream类型ty_s_media_resource,

ls_upld类型zzupld,

lv_filename类型为char30。

字段符号类似于it_key_tab的行。

读取表it_​​key_tab分配索引1。

"从字段符号中读取文件名,并将其存储到本地变量中

lv_filename = -值。

"现在从数据库中选择相应的文件以执行DOWNLOAD

从zzupld中选择单个*到ls_upld中,其中filename = lv_filename。

如果ls_upld不是初始的。

"现在复制二进制数据

ls_stream-value = ls_upld-value。

ls_stream-mime_type = ls_upld-mimetype。

copy_data_to_ref(

导出

is_data = ls_stream

更改

cr_data = er_stream

)。

endif。

终止方法。

7-您可以使用Gateway Client工具测试您的服务的上传和下载。

对于HTTP POST请求,您必须添加一个名为'slug'的标头参数及其值。 此参数将包含FILENAME。 请参阅

屏幕截图

对于DOWNLOAD(这是HTTP GET请求),您必须在实体集" FileSet"内指定了FILENAME之后添加"/img/$ value"。 请看

屏幕截图。

该代码绝对不是最佳的,但是它可以工作,我稍后会对其进行改进,因为我现在很高兴我理解它。 谢谢Ugur,您是最好的

一周热门 更多>