
@Core.MediaType
: Indicates that the element contains media data. The value of this annotation is either a string with the contained MIME type or is a path to the element that contains the MIME type.@Core.IsMediaType
: Indicates that the element contains a MIME typenamespace miyasuta.media;
using {
cuid,
managed
} from '@sap/cds/common';
entity Files: cuid, managed{
@Core.MediaType: mediaType
content: LargeBinary;
@Core.IsMediaType: true
mediaType: String;
fileName: String;
size: Integer;
url: String;
}
using { miyasuta.media as db } from '../db/data-model';
service Attachments {
entity Files as projection on db.Files
}
module.exports = async function () {
this.before('CREATE', 'Files', req => {
console.log('Create called')
console.log(JSON.stringify(req.data))
req.data.url = `/attachments/Files(${req.data.ID})/content`
})
}
{
"_version": "1.32.0",
"sap.app": {
...
"dataSources": {
"mainService": {
"uri": "/attachments/",
"type": "OData",
"settings": {
"odataVersion": "4.0",
"localUri": "localService/metadata.xml"
}
}
},
},
...
"sap.ui5": {
...
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "miyasuta.attachments.i18n.i18n"
}
},
"": {
"type": "sap.ui.model.odata.v4.ODataModel",
"settings": {
"synchronizationMode": "None",
"operationMode": "Server",
"autoExpandSelect": true,
"earlyRequests": true,
"groupProperties": {
"default": {
"submit": "Auto"
}
}
},
"dataSource": "mainService"
}
},
<mvc:View
controllerName="miyasuta.attachments.controller.App"
xmlns:mvc="sap.ui.core.mvc"
displayBlock="true"
xmlns="sap.m"
xmlns:upload="sap.m.upload"
>
<App id="app">
<pages>
<Page
id="page"
title="{i18n>title}"
>
<upload:UploadSet
id="uploadSet"
instantUpload="true"
uploadEnabled="true"
uploadUrl="/attachments/Files"
items="{
path: '/Files',
parameters: {
$orderby: 'createdAt desc'
},
templateShareable: false}"
>
<upload:toolbar>
</upload:toolbar>
<upload:items>
<upload:UploadSetItem
fileName="{fileName}"
mediaType="{mediaType}"
url="{url}"
enabledEdit="false"
visibleEdit="false"
openPressed="onOpenPressed"
>
<upload:attributes>
<ObjectAttribute
title="Uploaded By"
text="{createdBy}"
active="false"
/>
<ObjectAttribute
title="Uploaded on"
text="{createdAt}"
active="false"
/>
<ObjectAttribute
title="File Size"
text="{size}"
active="false"
/>
</upload:attributes>
</upload:UploadSetItem>
</upload:items>
</upload:UploadSet>
</Page>
</pages>
</App>
</mvc:View>
[cds] - POST /attachments/Files
[cds] - DeserializationError: No payload deserializer available for resource kind 'ENTITY' and mime type 'image/png'
<upload:UploadSet
id="uploadSet"
instantUpload="false"
uploadEnabled="true"
afterItemAdded="onAfterItemAdded"
uploadCompleted="onUploadCompleted"
items="{
path: '/Files',
parameters: {
$orderby: 'createdAt desc'
},
templateShareable: false}"
>
_createEntity
)._uploadContent
).sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageToast"
],
function (
Controller,
MessageToast
) {
"use strict";
return Controller.extend("miyasuta.attachments.controller.App", {
onInit: function () {
},
onAfterItemAdded: function (oEvent) {
var item = oEvent.getParameter("item")
this._createEntity(item)
.then((id) => {
this._uploadContent(item, id);
})
.catch((err) => {
console.log(err);
})
},
onUploadCompleted: function (oEvent) {
var oUploadSet = this.byId("uploadSet");
oUploadSet.removeAllIncompleteItems();
oUploadSet.getBinding("items").refresh();
},
onOpenPressed: function (oEvent) {
// to be implemented
},
_createEntity: function (item) {
var data = {
mediaType: item.getMediaType(),
fileName: item.getFileName(),
size: item.getFileObject().size
};
var settings = {
url: "/attachments/Files",
method: "POST",
headers: {
"Content-type": "application/json"
},
data: JSON.stringify(data)
}
return new Promise((resolve, reject) => {
$.ajax(settings)
.done((results, textStatus, request) => {
resolve(results.ID);
})
.fail((err) => {
reject(err);
})
})
},
_uploadContent: function (item, id) {
var url = `/attachments/Files(${id})/content`
item.setUploadUrl(url);
var oUploadSet = this.byId("uploadSet");
oUploadSet.setHttpRequestMethod("PUT")
oUploadSet.uploadItem(item);
}
});
});
http://localhost:4004/attachments/Files(<uuid>)/content
_download
). onOpenPressed: function (oEvent) {
oEvent.preventDefault();
var item = oEvent.getSource();
this._download(item)
.then((blob) => {
var url = window.URL.createObjectURL(blob);
//open in the browser
window.open(url);
})
.catch((err)=> {
console.log(err);
});
},
_download: function (item) {
var settings = {
url: item.getUrl(),
method: "GET",
xhrFields:{
responseType: "blob"
}
}
return new Promise((resolve, reject) => {
$.ajax(settings)
.done((result, textStatus, request) => {
resolve(result);
})
.fail((err) => {
reject(err);
})
});
},
onOpenPressed: function (oEvent) {
oEvent.preventDefault();
var item = oEvent.getSource();
this._fileName = item.getFileName();
this._download(item)
.then((blob) => {
var url = window.URL.createObjectURL(blob);
// //open in the browser
// window.open(url);
//download
var link = document.createElement('a');
link.href = url;
link.setAttribute('download', this._fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
})
.catch((err)=> {
console.log(err);
});
},
<upload:UploadSetItem
fileName="{fileName}"
mediaType="{mediaType}"
url="{url}"
thumbnailUrl="{
path: 'mediaType',
formatter: '.formatThumbnailUrl'
}"
...
>
formatThumbnailUrl: function (mediaType) {
var iconUrl;
switch (mediaType) {
case "image/png":
iconUrl = "sap-icon://card";
break;
case "text/plain":
iconUrl = "sap-icon://document-text";
break;
case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
iconUrl = "sap-icon://excel-attachment";
break;
case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
iconUrl = "sap-icon://doc-attachment";
break;
case "application/pdf":
iconUrl = "sap-icon://pdf-attachment";
break;
default:
iconUrl = "sap-icon://attachment";
}
return iconUrl;
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
21 | |
19 | |
9 | |
7 | |
5 | |
5 | |
5 | |
4 | |
4 | |
4 |