SAPUI5 (30) - OData 中 Image 的显示和编辑 (上)

2024-02-05 13:48
文章标签 显示 编辑 30 image odata sapui5

本文主要是介绍SAPUI5 (30) - OData 中 Image 的显示和编辑 (上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库中对图片的保存可以采取二进制格式,也就是我们平常所说的 blob 类型 ( Binary large object)。当图片使用 blob 类型来存储的时候,OpenUI5 如何处理据呢? 本篇就来作一个详细介绍。

使用 sap.m.Image 来显示图片

一般情况下,可以设置 sap.m.Imagesrc 属性,来显示一个本机或者网络的图片,比如:

var image = new sap.m.Image({src: "http://sap.github.io/openui5/images/icotxt_white_220x72_blue_open.png"
});

也可以把图片二进制文件通过 Base64 来编码,变成一个字符串,sap.m.Image 支持这种基于 Base64 编码的格式:

var oDataImage = new sap.m.Image({src: "data:image/gif;base64,R0lGODlhHwAeANU/AO1SReW2N+14Kf3YACOAulrAWtTW02Gh1uPIx/BkVFXKXu3t7bjZuoi9R7nV8fbOG8fBulSlWvh8ZlW0WvTu0aG8QqK92sGkdcWjoPr5+WyrUUaiV7q0oHWs2vrTCYOeiJ94QulCOYK34ceNifHEJfLWRuLf3tomHUWUzeQxLf/cDc1+dtzCOqKzo83o92mxbPSSjP/ohspCL2K1WG7Ga+k5NIGfWcbKKcu5ceTPBvDKAJfRkIyvjVvEXeV4af///yH5BAEAAD8ALAAAAAAfAB4AAAb/wJ9wSPwtDBCMEmJYFJ/QXwYx8kmuWIlvBMlEoaZVIptNmBMrw5eIObvfZkACgFn/MIA8/J3vj74jfYJycYMAIYh/TxCIiIaGjYg1NRBFCzYhNZGbk42TNSmhmiZELQogKZ+SNQkwrhICsbKzF0MLLwozMqmTKQAICy7CCxQlOg8PHh4DAyoPTj8QPQWnoikJCw4i29sOGSXKzOIqlT88CgXTuykhJg4HHdwdBxYUKuLjOFIv09Q2JydguIDXoaDBAw5i4GOmgkWGW/2ogTiBQASKAxgzHkAhgsLCZs8WzIjYQ4MMBBs1Zrxo7+MDEyILyJR5CiWKmzhxHmi58OWtzJkye8xA0IFATpwEOnj8SGJBhhdAZ+5wQMBozqoJPw5waC5qUANFq4pNylOcBxX6ok3wWoCGAQtjCVgwUWKhsgflfrKlweCtBQsGGFT46OFBAGg/WkxYu3eH4xcRcuC7+4ADkQURFrOduXiw2cKGEQuBkJkx2wkzlg1QVpgEiXJFWpQ2DXTCjdWUXVuOInuxb84NKD9wTWL3Fw4bIsz2zQIZcRIBjK8x8SG58ggbKjyHfkGNHSIGqm9IHqB8gAvdvXx/cgQCh/dMREMJAgA7"
});		oDataImage.placeAt("content");	

这是一个 Google Chrome 浏览器的图标,通过 Base64 编码后,用 Image 控件来显示。

显示 Northwind data service 中的图片

我们先用 Postman 这个 Chrome 插件来看看 http://services.odata.org/V2/Northwind/Northwind.svc/Categories?$format=json 的 请求结果:

我们可以看到 Picture 是以 Base64 编码的字符串。那么,这种图片类型,OData 的元数据是什么类型的呢? 看看 Northwind 的元数据,数据类型是 Edm.Binary。OData 对 Edm.Binary 就是用 Base64 编码来转换成字符串传输的。请参看:http://www.odata.org/documentation/odata-version-2-0/json-format/ 的描述。

接下来给出显示 Northwind OData Service 的完整代码:

<!DOCTYPE HTML>
<html><head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/><script src="../resources/sap-ui-core.js"id="sap-ui-bootstrap"data-sap-ui-libs="sap.m, sap.ui.table, sap.ui.layout"data-sap-ui-theme="sap_bluecrystal"></script><script>// Application datavar sUrl = "https://cors-anywhere.herokuapp.com/" + "services.odata.org/V2/Northwind/Northwind.svc/";var oModel = new sap.ui.model.odata.v2.ODataModel(sUrl)sap.ui.getCore().setModel(oModel);sap.ui.getCore().attachInit(function(){var oImage = new sap.m.Image({width: "200px",src: {path: "Picture",formatter: function(sValue){var sBase64BMP = btoa(atob(sValue).substr(78));var sDataUrl = "data:image/bmp;base64," + sBase64BMP;return sDataUrl;}}});var oForm = new sap.ui.layout.form.SimpleForm({content: [new sap.m.Label({text: "Picuture"}),oImage,new sap.m.Label({text: "Category ID"}),new sap.m.Input({value: "{CategoryID}"}),new sap.m.Label({text: "Category Name"}),new sap.m.Input({value: "{CategoryName}"}),new sap.m.Label({text: "Description"}),new sap.m.Input({value: "{Description}"}),]});			var oApp = new sap.m.App({pages: [new sap.m.Page("categoryPage", {title: "Northwind Image Display",content: [new sap.m.Panel({content: [oForm]				   })]})  ]});sap.ui.getCore().byId("categoryPage").bindElement("/Categories(1)");			oApp.placeAt("content"); 			});</script></head><body class="sapUiBody" role="application"><div id="content"></div></body>
</html>

对代码,解释两个部分:

  • SimpleForm: sap.ui.layout.form.SimpleForm 这个控件在展示扁平数据时候还是蛮方便的,控件对不同字段默认采取 Vertical layout, 每个字段包括 label 和 内容显示,默认采取 Horizontal layout

  • Image 的代码,采用的是绑定方式,绑定到 Picture 字段:

var oImage = new sap.m.Image({width: "200px",src: {path: "Picture",formatter: function(sValue){var sBase64BMP = btoa(atob(sValue).substr(78));var sDataUrl = "data:image/bmp;base64," + sBase64BMP;return sDataUrl;}}
});

为什么要加上 formatter 这段代码呢? 原因是因为 Northwind 数据库中图片,前面78个字节是 OLE 相关的信息, 所以将数据通过 JavaScript 的atob 解码为字符串,截取 78 个字节后面的内容,再使用 btoa 还原为 Base64 编码。

运行后,UI 显示界面如下:

很可惜,Northwind OData service 并不支持数据的写入,所以我们还需要使用 mock server 来模拟。因为近期较忙,只能抽时间写一点,下一篇再来介绍含图片的 CRUD 实现。

源代码

30_zui5_odata_image_read

这篇关于SAPUI5 (30) - OData 中 Image 的显示和编辑 (上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681099

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if