提问人:wildGhifari 提问时间:11/14/2023 最后编辑:Sandra RossiwildGhifari 更新时间:11/15/2023 访问量:48
OData - GET_STREAM 未从 SAPUI5 控制器触发下载附件文件的方法
OData - GET_STREAM Method to download an attachment file didn't triggered from SAPUI5 Controller
问:
背景
我正在使用 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 社区上的相关问题来找到解决方案,以找到我收到的错误消息。但是没有得到解决我问题的答案
答:
1赞
wildGhifari
11/15/2023
#1
正如@JanSchulz所说,在实体“附件”中有 3 个键,而我在 URL 中输入的只有一个键,通过将实体更改为只有一个键,这个问题已经解决了。感谢所有花时间帮助回答我问题的人。
评论
createKey
。检查Get_EntitySet(附件)的结果以获取正确的密钥/URL