我正在使用UploadSet组件从GOS上传、显示和下载附件;为了得到它,我正在遵循 ABAP Police 的这个tutorial,尽管我做了一些调整以获得我想要的结果。之前一切正常,我已经能够上传、显示和下载。
Odata服务和Bapi的所有实现都严格遵循ABAP Police所示的方法,除了如何显示和下载附件文件之外。下面的代码是我如何使用 UploadSet 组件下载附件。
<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>
...
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 服务中的实现:
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 社区上的相关问题来找到我收到的错误消息的解决方案。但没有得到解决我的问题的答案
正如@JanSchulz所说,在实体“附件”中有3个键,而我在URL中放入的只有一个,通过将实体更改为只有一个键解决了这个问题。感谢所有花时间帮助回答我的问题的人。