点击此处---> 群内免费提供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)
嘿,格雷斯,
您的文件实体看起来只有1个属性? 这就是全部。 如果是,则不能将所有这些字段传递给er_entity。 看起来,您正在尝试在实体结构中显示表中的值,这可能是错误。
如果否,能否在最后显示er_entity字段(和文件实体结构)? create_stream方法。 我想确保您填写了ls_file(返回实体)的所有必填字段。
您还可以将/N/IWFND/ERROR_LOG事务中的错误的屏幕截图放置吗。
Ugur。
在我们的上载和下载过程中,我们将使用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,您是最好的
非常感谢您提供非常有用的博客.. !!
一周热门 更多>