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 IF IT PRODUCES 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_DMS_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,
NAME TYPE STRING,
TYPE TYPE STRING,
OBJECT TYPE CHAR30,
OBJTYPE TYPE DOKOB,
DESCR TYPE STRING,
DOCTYPE TYPE DOKAR,
HEXCONT TYPE XSTRING,
END OF TYPE_FILE.
**************************************************************************************
" VARIABLES AND OTHERS
**************************************************************************************
"Tables
DATA: LT_DOC_LINKS TYPE TABLE OF BAPI_DOC_DRAD.
DATA: LT_DOC_DESCR TYPE TABLE OF BAPI_DOC_DRAT.
DATA: LT_DOC_FILES TYPE TABLE OF BAPI_DOC_FILES2.
"Structures
DATA: LS_FILE TYPE TYPE_FILE.
DATA: LS_DOCDATA TYPE BAPI_DOC_DRAW2.
DATA: LS_DOC_LINK TYPE BAPI_DOC_DRAD.
DATA: LS_DOC_DESCR TYPE BAPI_DOC_DRAT.
DATA: LS_DOC_FILE TYPE BAPI_DOC_FILES2.
"Variables
DATA: LV_JSON_BODY TYPE STRING.
DATA: LV_NOTIF_NUMBER TYPE QMNUM.
DATA: LV_EQUI_NUMBER TYPE EQUNR.
DATA: LV_FUNCL_NUMBER TYPE TPLNR.
DATA: LV_DOC_NUMBER TYPE DOKNR.
DATA: LV_FILENAME TYPE STRING.
DATA: LV_OUTPUT_LENGTH TYPE I.
"Objects
DATA: LR_DESERIALIZER TYPE REF TO CL_TREX_JSON_DESERIALIZER.
CREATE OBJECT LR_DESERIALIZER.
**************************************************************************************
" GET JSON DATA FROM POST REQUEST
**************************************************************************************
LV_JSON_BODY = ME->ZIF_REST~REQUEST->GET_CDATA( ).
**************************************************************************************
" CONVERT JSON STRING TO ABAP STRUCTURE
**************************************************************************************
LR_DESERIALIZER->DESERIALIZE(
EXPORTING
JSON = LV_JSON_BODY
IMPORTING
ABAP = LS_FILE ).
**************************************************************************************
" CONVERT HEX STRING TO FILE AND SAVE IT IN TEMP FOLDER
**************************************************************************************
CONCATENATE '/usr/sap/' LS_FILE-NAME '.' LS_FILE-TYPE INTO LV_FILENAME.
IF LS_FILE-HEXCONT IS NOT INITIAL.
LV_OUTPUT_LENGTH = XSTRLEN( LS_FILE-HEXCONT ).
OPEN DATASET LV_FILENAME FOR OUTPUT IN BINARY MODE.
TRANSFER LS_FILE-HEXCONT TO LV_FILENAME.
CLOSE DATASET LV_FILENAME.
ENDIF.
**************************************************************************************
" SET VALUES OF LINK TABLES
**************************************************************************************
LS_DOCDATA-DOCUMENTTYPE = LS_FILE-DOCTYPE.
LS_DOCDATA-DOCUMENTVERSION = '00'.
LS_DOCDATA-DOCUMENTPART = '000'.
LS_DOCDATA-LABORATORY = '001'.
LS_DOC_DESCR-DESCRIPTION = LS_FILE-DESCR.
LS_DOC_DESCR-LANGUAGE = 'E'.
LS_DOC_DESCR-LANGUAGE_ISO = 'EN'.
APPEND LS_DOC_DESCR TO LT_DOC_DESCR.
LS_DOC_FILE-ORIGINALTYPE = '001'.
LS_DOC_FILE-STORAGECATEGORY = 'DMS_C1_ST'.
LS_DOC_FILE-SOURCEDATACARRIER = 'SAP-SYSTEM'.
LS_DOC_FILE-CREATED_BY = SY-UNAME.
LS_DOC_FILE-DOCFILE = LV_FILENAME.
LS_DOC_FILE-WSAPPLICATION = LS_FILE-TYPE.
APPEND LS_DOC_FILE TO LT_DOC_FILES.
LS_DOC_LINK-OBJECTTYPE = LS_FILE-OBJTYPE.
"set object and object type when dealing with a notification
IF LS_FILE-OBJTYPE EQ 'PMQMEL'.
UNPACK LS_FILE-OBJECT TO LV_NOTIF_NUMBER.
LS_DOC_LINK-OBJECTKEY = LV_NOTIF_NUMBER.
ENDIF.
"set object and object type when dealing with an equipment
IF LS_FILE-OBJTYPE EQ 'EQUI'.
UNPACK LS_FILE-OBJECT TO LV_EQUI_NUMBER.
LS_DOC_LINK-OBJECTKEY = LV_EQUI_NUMBER.
ENDIF.
"set object and object type when dealing with a functional location
IF LS_FILE-OBJTYPE EQ 'IFLOT'.
UNPACK LS_FILE-OBJECT TO LV_FUNCL_NUMBER.
LS_DOC_LINK-OBJECTKEY = LV_FUNCL_NUMBER.
ENDIF.
APPEND LS_DOC_LINK TO LT_DOC_LINKS.
**************************************************************************************
" CREATE ATTACHMENT
**************************************************************************************
CALL FUNCTION 'BAPI_DOCUMENT_CREATE2'
EXPORTING
DOCUMENTDATA = LS_DOCDATA
PF_FTP_DEST = 'SAPFTPA'
PF_HTTP_DEST = 'SAPHTTP'
IMPORTING
DOCUMENTNUMBER = LV_DOC_NUMBER
TABLES
DOCUMENTDESCRIPTIONS = LT_DOC_DESCR
OBJECTLINKS = LT_DOC_LINKS
DOCUMENTFILES = LT_DOC_FILES.
**************************************************************************************
" 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="idObjectNumber" placeholder="object number" width="225px" />
<Input type="text" id="idObjectType" placeholder="object type" width="225px" />
<Input type="text" id="idDocType" placeholder="document type" width="225px" />
<Input type="text" id="idDescription" placeholder="description" 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 objectNumber = this.byId("idObjectNumber").getValue();
var objectType = this.byId("idObjectType").getValue();
var docType = this.byId("idDocType").getValue();
var description = this.byId("idDescription").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, hexString, docType, description, objectNumber, objectType);
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/dms_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, hexString, docType, description, objectNumber , objectType) {
return '{name:"' + fileName + '",' +
'type:"' + fileType + '",' +
'object:"' + objectNumber + '",' +
'objtype:"' + objectType + '",' +
'descr:"' + description + '",' +
'doctype:"' + docType + '",' +
'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 |
---|---|
8 | |
5 | |
5 | |
4 | |
4 | |
3 | |
3 | |
3 | |
3 | |
3 |