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

OData - GET_STREAM Method to download an attachment file didn't triggered from SAPUI5 Controller

提问人:wildGhifari 提问时间:11/14/2023 最后编辑:Sandra RossiwildGhifari 更新时间:11/15/2023 访问量:48

问:

背景

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

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 包含无效的键谓词。

以下是我的 Odata 服务中 GET_STREAM 方法的实现:

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 网关

评论

2赞 Jan Schulz 11/14/2023
在博客文章中,实体“附件”有 3 个键(ObjectId、ObjectType、ObjectCat)。您只使用一个键 (ObjectId) 生成 URL。一般情况下,使用以下方法构建密钥:createKey。检查Get_EntitySet(附件)的结果以获取正确的密钥/URL
0赞 fabiopagoti 11/15/2023
除了上面评论中提到的错误密钥外,请记住,如果您从 BTP 工作区运行 SAPUI5 应用程序,此类调用也会失败。确保始终使用相对 URL 为任何 Ajax 调用调用 Manifest.resolveUri 方法 - 尤其是在控制器中。

答:

1赞 wildGhifari 11/15/2023 #1

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