METHOD IF_HTTP_EXTENSION~HANDLE_REQUEST.
***************************************************************************
" VARIABLES
***************************************************************************
DATA: LO_REST_CLASS TYPE REF TO ZIF_REST.
DATA: LV_REASON TYPE STRING.
DATA: LO_ERROR TYPE REF TO CX_ROOT.
***************************************************************************
" GET THE CLASS WE WANT TO EXECUTE
***************************************************************************
TRY.
LO_REST_CLASS ?= GET_REST( IO_SERVER = SERVER ).
***************************************************************************
" EXECUTE THE CLASS
***************************************************************************
LO_REST->HANDLE_REQUEST( ).
***************************************************************************
" CATCH ERRORS
***************************************************************************
CATCH CX_ROOT INTO LO_ERROR.
LV_REASON = LO_ERROR->GET_TEXT( ).
SERVER->RESPONSE->SET_STATUS( CODE = 500
REASON = LV_REASON ).
ENDTRY.
ENDMETHOD.
METHOD GET_REST.
***************************************************************************
" VARIABLES
***************************************************************************
DATA: LV_CLASS_NAME TYPE SEOCLSNAME.
DATA: LV_REQUEST_METHOD TYPE STRING.
DATA: LV_ERROR TYPE TEXT255.
***************************************************************************
" GET REQUEST METHOD TO GET CLASS NAME TO EXECUTE
***************************************************************************
LV_REQUEST_METHOD = IO_SERVER->REQUEST->GET_HEADER_FIELD( '~request_method' ).
CONCATENATE 'ZCL_TEST_GOS_ATTACHMENT_' LV_REQUEST_METHOD INTO LV_CLASS_NAME.
***************************************************************************
" RETURN CLASS OBJECT
***************************************************************************
TRY.
CREATE OBJECT EO_REST
TYPE (LV_CLASS_NAME)
EXPORTING
IO_REQUEST = IO_SERVER->REQUEST
IO_RESPONSE = IO_SERVER->RESPONSE.
***************************************************************************
" CATCH ERRORS
***************************************************************************
CATCH CX_SY_CREATE_OBJECT_ERROR.
LV_ERROR = 'Method ''&'' not supported'(001).
ENDTRY.
ENDMETHOD.
METHOD ZIF_REST~HANDLE_REQUEST.
**************************************************************************************
" TYPES
**************************************************************************************
TYPES: BEGIN OF TYPE_FILE,
FNAME TYPE STRING,
FTYPE TYPE STRING,
QMNUM TYPE QMNUM,
HEXCONT TYPE XSTRING,
END OF TYPE_FILE.
**************************************************************************************
" VARIABLES AND OBJECTS
**************************************************************************************
DATA: LT_RETURN TYPE TABLE OF BAPIRET2.
DATA: LT_HEXCONTENT TYPE TABLE OF SOLIX.
DATA: LS_FILE TYPE TYPE_FILE.
DATA: LS_NOTIF TYPE BORIDENT.
DATA: LS_ATTACH TYPE BORIDENT.
DATA: LS_DOCDATA TYPE SODOCCHGI1.
DATA: LS_DOCINFO TYPE SOFOLENTI1.
DATA: LV_DOCTYPE TYPE SOODK-OBJTP.
DATA: LV_FOLDER TYPE SOOBJINFI1-OBJECT_ID.
DATA: LV_LENGTH TYPE I.
DATA: LV_JSON_BODY TYPE STRING.
DATA: LV_NOTIF_NUMBER TYPE QMNUM.
DATA: LR_DESERIALIZER TYPE REF TO CL_TREX_JSON_DESERIALIZER.
**************************************************************************************
" INSTANTIATE VARIABLES
**************************************************************************************
CREATE OBJECT LR_DESERIALIZER.
LV_FOLDER = 'FOL40000000000004'.
**************************************************************************************
" GET JSON DATA
**************************************************************************************
LV_JSON_BODY = ME->ZIF_REST~REQUEST->GET_CDATA( ).
**************************************************************************************
" CONVERT JSON DATA TO ABAP DATA
**************************************************************************************
LR_JSON_DESERIALIZER->DESERIALIZE(
EXPORTING
JSON = LV_JSON_BODY
IMPORTING
ABAP = LS_FILE ).
**************************************************************************************
" CONVERT HEX STRING TO BINARY TABLE
**************************************************************************************
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
BUFFER = LS_FILE-HEXCONT
IMPORTING
OUTPUT_LENGTH = LV_LENGTH
TABLES
BINARY_TAB = LT_HEXCONTENT.
**************************************************************************************
" SET VALUES
**************************************************************************************
LS_DOCDATA-OBJ_DESCR = LS_FILE-FNAME.
LS_DOCDATA-OBJ_LANGU = 'E'.
LS_DOCDATA-OBJ_NAME = 'MESSAGE'.
LS_DOCDATA-DOC_SIZE = XSTRLEN( LS_FILE-HEXCONT ).
LV_DOCTYPE = LS_FILE-FTYPE.
UNPACK LS_FILE-QMNUM TO LV_NOTIF_NUMBER.
**************************************************************************************
" CREATE ATTACHMENT
**************************************************************************************
CALL FUNCTION 'SO_DOCUMENT_INSERT_API1'
EXPORTING
FOLDER_ID = LV_FOLDER
DOCUMENT_DATA = LS_DOCDATA
DOCUMENT_TYPE = LV_DOCTYPE
IMPORTING
DOCUMENT_INFO = LS_DOCINFO
TABLES
CONTENTS_HEX = LT_HEXCONTENT.
**************************************************************************************
" CREATE LINK TO OBJECT (Notification)
**************************************************************************************
LS_NOTIF-OBJKEY = LV_NOTIF_NUMBER.
LS_NOTIF-OBJTYPE = 'BUS2038'.
LS_ATTACH-OBJKEY = LS_DOCINFO-DOC_ID.
LS_ATTACH-OBJTYPE = 'MESSAGE'.
CALL FUNCTION 'BINARY_RELATION_CREATE'
EXPORTING
OBJ_ROLEA = LS_NOTIF
OBJ_ROLEB = LS_ATTACH
RELATIONTYPE = 'ATTA'.
**************************************************************************************
" COMMIT
**************************************************************************************
COMMIT WORK.
ENDMETHOD.
METHOD CONSTRUCTOR.
ME->ZIF_REST~RESPONSE = IO_RESPONSE.
ME->ZIF_REST~REQUEST = IO_REQUEST.
ENDMETHOD.
<mvc:View controllerName="FileUploader.controller.Main" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:u="sap.ui.unified">
<App>
<pages>
<Page title="File uploader">
<content>
<VBox class="sapUiSmallMargin">
<Input type="text" id="idNotifNumber" placeholder="notification number" width="225px" />
<u:FileUploader
id="fileUploader"
name="myFileUpload"
width="340px"
uploadUrl="upload/"
tooltip="Upload your file to the local server"
change="onChange"/>
<Button
text="Upload File"
press="onConfirm"/>
</VBox>
</content>
</Page>
</pages>
</App>
</mvc:View>
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function(Controller) {
"use strict";
return Controller.extend("FileUploader.controller.Main", {
onChange: function(oEvent) { // When the user selects a file
this.lastSelectedFile = oEvent.getParameter("files")[0];
},
onConfirm: function() { // When the user presses the upload button
this.uploadFile(this.lastSelectedFile);
},
uploadFile: function(file) {
var that = this;
var fileName = file.name.split(".")[0];
var fileType = file.name.split(".")[1];
var notificationNumber = this.byId("idNotifNumber").getValue();
var reader = new FileReader();
reader.onload = function(e) {
var raw = e.target.result;
var hexString = that.convertBinaryToHex(raw).toUpperCase();
var fileAsJsonString = that.createJsonObjectForFileInfo(fileName, fileType, notificationNumber, hexString);
that.postAttachment(fileAsJsonString);
};
reader.onerror = function() {
sap.m.MessageToast.show("error");
};
reader.readAsArrayBuffer(file);
},
postAttachment: function(fileAsJsonString) {
var url = "http://xx.xxx.xx.xxx:8000/zrest/gos_attach?sap-client=400";
var promise = new Promise(
function(resolve, reject) {
var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.onreadystatechange = function() {
if (this.readyState === 4) {
if (this.status === 200) {
sap.m.MessageToast.show("success");
} else {
sap.m.MessageToast.show("error");
}
}
}
xhttp.send(fileAsJsonString);
});
return promise;
},
// create sap json string
createJsonObjectForFileInfo: function(fileName, fileType, notificationNumber, hexString) {
return '{fname:"' + fileName + '",' +
'ftype:"' + fileType + '",' +
'qmnum:"' + notificationNumber + '",' +
'hexcont:"' + hexString + '"}';
},
convertBinaryToHex: function(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
});
});
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
9 | |
8 | |
6 | |
5 | |
4 | |
4 | |
4 | |
3 | |
3 | |
3 |