You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从Gateway发送PDF至Fiori应用并在新标签页显示的完整实现示例

嘿,我刚好做过类似的Fiori场景,给你一个完整的端到端实现方案,分ABAP后端和UI5前端两部分,一步步来应该就能搞定!

ABAP 后端实现

我们用OData服务来提供PDF文件的访问接口,这是Fiori架构下最标准的方式:

1. 创建OData服务(SEGW)

  • 打开SEGW,新建一个项目(比如ZPDF_SRV)
  • 右键点击「Entity Types」→「Create」,定义一个实体类型ZPDFDocument,设置一个Key字段(比如DocumentID,类型Edm.String)
  • 右键点击「Function Imports」→「Create」,创建一个名为GetPDF的函数导入:
    • 选择「HTTP Method」为GET
    • 「Return Type」选择刚才创建的ZPDFDocument,并勾选「Media Resource」(因为我们要返回二进制文件)
  • 点击「Generate Runtime Objects」生成服务的DPC和MPC类

2. 实现Function Import的逻辑

打开生成的DPC_EXT类(比如ZCL_ZPDF_SRV_DPC_EXT),重写/IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION方法,添加以下代码:

METHOD /iwbep/if_mgw_appl_srv_runtime~execute_action.

  DATA: lv_action_name TYPE /iwbep/mgw_tech_name,
        lv_document_id TYPE string,
        lv_pdf_binary  TYPE xstring,
        lo_response    TYPE REF TO /iwbep/if_mgw_resp_entity.

  " 获取当前调用的Action名称
  lv_action_name = io_request->get_action_name( ).

  IF lv_action_name = 'GetPDF'.
    " 获取传入的DocumentID参数
    io_request->get_header_parameter( EXPORTING iv_name = 'DocumentID' IMPORTING ev_value = lv_document_id ).

    " **************************
    " 这里替换成你的PDF获取逻辑
    " 示例1:从MIME仓库读取PDF
    lv_pdf_binary = cl_mime_repository_api=>get( iv_name = '/SAP/PUBLIC/YOUR_FOLDER/' && lv_document_id && '.pdf' ).
    " 示例2:从数据库表读取(假设表ZPDF_TABLE有DocumentID和Content字段)
    " SELECT SINGLE content INTO lv_pdf_binary FROM zpdf_table WHERE document_id = lv_document_id.
    " **************************

    " 设置响应头,告诉前端这是PDF文件
    lo_response = me->/iwbep/if_mgw_conv_srv_runtime~get_response( ).
    lo_response->set_header_field( iv_name = 'Content-Type' iv_value = 'application/pdf' ).
    lo_response->set_header_field( iv_name = 'Content-Disposition' iv_value = |inline; filename="{lv_document_id}.pdf"| ).
    " 把二进制数据放入响应
    lo_response->set_data( iv_data = lv_pdf_binary ).
  ENDIF.

ENDMETHOD.

3. 激活并测试服务

  • 激活所有生成的对象
  • 用事务码GW_CLIENT测试这个OData服务:
    • 输入服务URL:/sap/opu/odata/sap/ZPDF_SRV/GetPDF?DocumentID=DOC001
    • 点击「Execute」,如果返回PDF文件,说明后端接口没问题
UI5 前端实现

接下来在UI5应用里实现按钮点击调用接口并打开PDF的逻辑:

1. 在View里添加按钮

在你的XML View中添加一个按钮,绑定点击事件:

<Button text="打开PDF" press=".onOpenPDF" />

2. 在Controller里实现点击事件

在对应的Controller中添加onOpenPDF方法:

onOpenPDF: function() {
    var oModel = this.getView().getModel();
    var sDocumentID = "DOC001"; // 这里可以替换成用户选择的文档ID,比如从表格中获取

    oModel.callFunction("/GetPDF", {
        method: "GET",
        urlParameters: {
            DocumentID: sDocumentID
        },
        success: function(oData, oResponse) {
            // 将返回的二进制数据转为Blob
            var oBlob = new Blob([oResponse.body], { type: "application/pdf" });
            // 生成临时URL
            var sBlobUrl = URL.createObjectURL(oBlob);
            // 在新标签页打开PDF
            window.open(sBlobUrl, "_blank");
            
            // 延迟释放临时URL,避免内存泄漏
            setTimeout(function() {
                URL.revokeObjectURL(sBlobUrl);
            }, 1000);
        },
        error: function(oError) {
            sap.m.MessageBox.error("获取PDF失败:" + oError.message);
        }
    });
}

3. 关键注意事项

  • 跨域问题:如果你的Fiori应用和ABAP后端是同域部署,不用担心跨域;如果是跨域,需要在ABAP端配置CORS(事务码SICF,找到对应的服务节点,设置CORS规则)
  • 权限控制:确保当前用户有权限访问OData服务和对应的PDF文件(可以通过PFCG角色分配权限)
  • 内存泄漏:一定要记得调用URL.revokeObjectURL释放临时URL,否则会占用浏览器内存

这样一套流程下来,用户点击按钮就能从后端获取PDF并在新标签页打开了!

内容的提问来源于stack exchange,提问作者user3510821

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:22:19