OData - SAPUI5 控制器未触发下载附件文件的 GET_STREAM 方法

问题描述 投票:0回答:1

背景

我正在使用UploadSet组件从GOS上传、显示和下载附件;为了得到它,我正在遵循 ABAP Police 的这个tutorial,尽管我做了一些调整以获得我想要的结果。之前一切正常,我已经能够上传、显示和下载。

Odata服务和Bapi的所有实现都严格遵循ABAP Police所示的方法,除了如何显示和下载附件文件之外。下面的代码是我如何使用 UploadSet 组件下载附件。

SAPUI5视图

<mvc:View
     controller="..controller.activity"
     xmlns="sap.m"
     xmlns:mvc="sap.ui.core.mvc"
     xmlns:upload="sap.m.upload">
     ...
     <upload:UploadSet
         id="uploadActivityAttachment"
         class="uploadActivityAttachment"
         instantUpload="true"
         uploadUrl="/sap/opu/odata/sap/ZTEST_ATTACHMENT_2_SRV/attachmentSet"
         mode="MultiSelect"
         multiple="true"
         beforeUploadStarts="onBeforeUploadStarts"
         uploadCompleted="onUploadCompleted"
         items="{attachmentData>/attachment}">
         <upload:toolbar>
              <OverflowToolbar>
                    <ToolbarSpacer />
                    <Button 
                        id="downloadSelectedButton"
                        text="Download selected"
                        press="onDownloadSelectedButton" />
              </OverflowToolbar>
         </upload:toolbar>
         <upload:items>
              <upload:UploadSetItem
                     fileName="{attachmentData>FileName}"
                     mediaType="{attachmentData>MimeType}"
                     enabledEdit="false"
                     visibleEdit="false"
                     enabledRemove="true"
                     visibleRemove="true"
                     removePressed="onRemoveAttachment"
                     thumbnailUrl="{attachmentData>ThumbnailUrl}">
                     <upload:statuses>
                          <ObjectStatus
                              title="Document Id"
                              text="{attachmentData>DocumentId}"
                              visible="false" />
                          <ObjectStatus
                              title="Uploaded by"
                              text="{attachmentData>CreatorName}" />
                          <ObjectStatus
                              title="On"
                              text="{attachmentData>FormattedDateTime}" />
                     </upload:statuses>
              </upload:UploadSetItem>
         </upload:items>
     </upload:UploadSet>
...
</mvc:View>

SAPUI5控制器

...
onDownloadSelectedButton: async function () {
    let itemDocId;
    const oUploadSet = this.getView().byId('uploadActivityAttachment');
    oUploadSet.getItems().forEach((item) => {
        (item.getListItem().getSelected()) {
         itemDocId = item.getStatuses()[0].getText();                  
         item.setUrl(`/sap/opu/odata/sap/ZTEST_ATTACHMENT_2_SRV/attachmentSet('${itemDocId}')/$value`);
         item.download(true);
    }
    });
},
...

问题

GET_STREAM 方法之前工作正常,直到现在。当我运行下载功能时,我收到如下错误消息:

请求 URI 包含无效的键谓词。

这是 GET_STREAM 方法在我的 Odata 服务中的实现:

GET_STREAM方法

  METHOD /IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_STREAM.

    DATA LS_STREAM  TYPE TY_S_MEDIA_RESOURCE.
    DATA(LV_ENTITY_SET_NAME) = IO_TECH_REQUEST_CONTEXT->GET_ENTITY_SET_NAME( ).
    DATA(LT_KEYS) = IO_TECH_REQUEST_CONTEXT->GET_KEYS( ).

    CASE LV_ENTITY_SET_NAME.
      WHEN 'attachmentSet'.
        DATA: LV_DOCUMENT_ID TYPE DOCUMENTID,
              LV_FILENAME    TYPE SO_OBJ_DES.
        LV_DOCUMENT_ID = LT_KEYS[ NAME = 'DOCUMENT_ID' ]-VALUE.
        CALL FUNCTION 'Z_DOWNLOAD_ATTACHMENT'
          EXPORTING
            IV_DOCUMENT_ID = LV_DOCUMENT_ID
          IMPORTING
            EV_VALUE       = LS_STREAM-VALUE
            EV_MIME_TYPE   = LS_STREAM-MIME_TYPE
            EV_FILENAME    = LV_FILENAME.

        DATA LS_LHEADER TYPE IHTTPNVP.
        LV_FILENAME = ESCAPE( VAL = LV_FILENAME FORMAT = CL_ABAP_FORMAT=>E_URL ).
        LS_LHEADER-NAME = 'Content-Disposition'.
        LS_LHEADER-VALUE = 'outline; filename=”' && LV_FILENAME && '”;'.
        SET_HEADER( IS_HEADER = LS_LHEADER ).

        COPY_DATA_TO_REF( EXPORTING IS_DATA = LS_STREAM
                          CHANGING  CR_DATA = ER_STREAM ).

    ENDCASE.
  ENDMETHOD.

谁能告诉我,为什么会突然出现我上面提到的错误?而之前它工作得很好。你们能给我一个建议吗? 谢谢!

我尝试通过阅读 sap 社区上的相关问题来找到我收到的错误消息的解决方案。但没有得到解决我的问题的答案

odata sapui5 uri sap-gateway
1个回答
0
投票

正如@JanSchulz所说,在实体“附件”中有3个键,而我在URL中放入的只有一个,通过将实体更改为只有一个键解决了这个问题。感谢所有花时间帮助回答我的问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.