UI5与后端的文件交互(三)

文章目录

  • 前言
  • 一、开发Action
    • 1. 修改Table
    • 2. BDEF中新增Action
    • 3. 新建结构,用于接收uuid以及附件数据
    • 4. 实现Method逻辑
  • 二、UI5项目修改
    • 1. 添加表格行
    • 2. 事件处理函数
    • 3. 点击文件名时的事件
  • 三、测试


前言

这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。
这篇的主要内容有:

  1. 后端RAP的开发(S4HANA On-Premise)
    • 新建Action(保存base64)
  2. 前端(UI5)读取文件并保存到后端
    • 传输文件流,并保存在ABAP数据库表
    • 在前端下载已保存的文件
    • 在前端显示已保存的图片

一、开发Action

1. 修改Table

  • 新增3个字段 attachment ,filename,filetype
  • 对应的CDS也添加三个字段
define table ymoon_t010 {key client : abap.clnt not null;key uuid   : sysuuid_x16 not null;name       : abap.char(40);age        : abap.int1;gender     : abap.char(10);city       : abap.char(40);attachment : abap.string(0);filename   : abap.char(100);filetype   : abap.char(100);}

2. BDEF中新增Action

managed implementation in class zbp_moon_i_010 unique;
strict ( 2 );define behavior for ymoon_i_010 alias Student
persistent table YMOON_T010
early numbering
lock master
authorization master ( instance )
//etag master <field_name>
{create;update;delete;//Add Actionstatic action upload_file parameter ymoon_s010;//新增Actionstatic action upload_attachment parameter ymoon_s011;}

3. 新建结构,用于接收uuid以及附件数据

@EndUserText.label : 'uuid & Attachment'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
define structure ymoon_s011 {uuid       : sysuuid_x16;attachment : abap.string(0);filename   : abap.string(0);
}

4. 实现Method逻辑

这里把base64保存到string类型中

  method upload_attachment."获取UI5传送的parameterdata(uuid) = keys[ 1 ]-%param-uuid.data(attachment) = keys[ 1 ]-%param-attachment.data(filename_full) = keys[ 1 ]-%param-filename."split filename_full at `.` into data(lv_filename) data(lv_filetype)."更新update ymoon_t010set filename = lv_filenamefiletype = lv_filetypeattachment = attachmentwhere uuid = uuid.endmethod.

二、UI5项目修改

1. 添加表格行

  • 新增附件和文件名列, 并使用FileUploader和Link组成cell
<columns><Column><Text text="姓名" /></Column><Column><Text text="年龄" /></Column><Column><Text text="性别" /></Column><Column><Text text="城市" /></Column><Column><Text text="选择附件" /></Column><Column><Text text="文件名" /></Column>
</columns>
<items><ColumnListItem><cells><Text text="{Name}" /><Text text="{Age}" /><Text text="{Gender}" /><Text text="{City}" /><u:FileUploaderid="Attachment"name="Attachment"tooltip="Upload your Attachment to the server"buttonText="上传附件"change="onUploadAttachment"/><Link text="{= ${Filename} !== '' ? ${Filename} + '.' + ${Filetype} : ''}" /></cells></ColumnListItem>
</items>

2. 事件处理函数

  • 上传文件时,获取当前行的uuid并调用Action传输到后端
onUploadAttachment: function (e) {// console.log(e)var oModel = this.getView().getModel();var file = e.getParameter("files")[0]var filename = e.getSource().getProperty('value')var uuid = e.getSource().getBindingContext().getProperty().Uuidvar reader = new FileReader();reader.onload = function (evt) {// 获取文件流var vContent = evt.currentTarget.result;oModel.callFunction("/upload_attachment",   {method: "POST",   urlParameters: {   //参数,首字母大写 "Uuid": uuid,"Attachment": vContent,"Filename": filename},success: function (odata, response) {//Model RefreshMessageBox.information("附件上传成功! " + filename);oModel.refresh(true);},error: function (res) {console.log(res)}})}reader.readAsDataURL(file);}

3. 点击文件名时的事件

  • 点击文件时,会下载对应的文件。 如果是图片类型,则直接显示在浏览器Dialog上

这里值得一提的是Image控件可以直接显示BASE64值的图片,不需要传入图片路径也可

onClickFilename: function (e) {var oData = e.getSource().getBindingContext().getProperty()var validFileTypes = ['gif', 'jpg', 'png', 'jpeg'];var vContent = oData.Attachmentif (validFileTypes.includes(oData.Filetype)) {// 创建图片控件this.oImage = new Image({src: oData.Attachment,width: "100%"});// 创建对话框this.oDialog = new Dialog({title: "Image Dialog",content: this.oImage,beginButton: new Button({text: "Close",press: function () {this.oDialog.close();}.bind(this)})});// 打开对话框this.oDialog.open();} else {var sContent = vContent.split(";")var Mimetype = sContent[0].split(":")var Docum = sContent[1].split(",")//下载需要把base64转为blobvar blob = this.base64toBlob(Docum[1], Mimetype[1]);File.save(blob, oData.Filename, oData.Filetype, Mimetype[1]);}},base64toBlob(base64Data, contentType) {contentType = contentType || '';var sliceSize = 512;var byteCharacters = atob(base64Data);var byteArrays = [];for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {var slice = byteCharacters.slice(offset, offset + sliceSize);var byteNumbers = new Array(slice.length);for (var i = 0; i < slice.length; i++) {byteNumbers[i] = slice.charCodeAt(i);}var byteArray = new Uint8Array(byteNumbers);byteArrays.push(byteArray);}var blob = new Blob(byteArrays, { type: contentType });return blob;}

三、测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LMM 008】Instruction Tuning with GPT-4

论文标题&#xff1a;Instruction Tuning with GPT-4 论文作者&#xff1a;Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, Jianfeng Gao 作者单位&#xff1a;Microsoft Research 论文原文&#xff1a;https://arxiv.org/abs/2304.03277 论文出处&#xff1a;– 论文…

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

Redis 持久化—RDB

文章目录 1. 为什么需要Redis持久化&#xff1f;2. Redis持久化的几种方式3. RDB简介4. 持久化触发4.1 手动触发4.1.1 save命令4.1.2 bgsave 命令 4.2 自动触发4.2.1 save m n4.2.2 flushall4.2.3 主从同步触发 5. 配置说明6. 配置配置7. 配置配置8. RDB 文件恢复9. RDB 优缺点…

擎创动态 | 某城商行案例入选信通院 GOLF+年度明星解决方案

2023年12月15日&#xff0c;“2023GOLF IT新治理领导力论坛”在京召开&#xff0c;该论坛由中国信息通信研究院、中国通信标准化协会主办。在此次论坛中&#xff0c;主办方正式发布了XOps领域年度评选结果。擎创科技“一体化智能根因定位解决方案”凭借优秀的落地实践成果&…

机器学习--主成分分析 PCA

特征维度约减 特征约减的目的是将高维特征向量映射到低维子空间中。比如&#xff1a; 给定n个样本&#xff08;每个样本维度为p维&#xff09;{x1,....xn} 通过特征变换/投影矩阵实现特征空间的压缩: 高维数据 为何要维度约减? 数据压缩和存储&#xff1a;高维数据通常需要占用…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic&#xff0c;原名MagicDraw&#xff0c;俗称No Magic&#xff0c;被达索收购后融入3DExperience产品协同研发管理平台中&#xff0c;形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持&#xff0c;提供独有的MagicGrid方法论&…

易点易动固定资产管理系统集成企业微信,帮助企业全生命周期管理固定资产

在现代企业中&#xff0c;固定资产管理是一项至关重要的任务。固定资产的高效管理可以提高企业的运营效率、降低成本&#xff0c;并确保资产的安全和稳定。然而&#xff0c;传统的固定资产管理方法往往复杂繁琐&#xff0c;容易出现信息不准确、流程不畅和数据不一致的问题。为…

设计模式:简单工厂模式

这里写目录标题 工厂模式简介核心角色&#xff1a;实现 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封…

d3dcompiler_43.dll丢失怎么修复?怎么解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler_43.dll文件”。那么&#xff0c;d3dcompiler_43.dll是什么文件&#xff1f;它的作用是什么&#xff1f;如果缺失了该如何修复呢&#xff1f;本文将详细介绍d3dcompiler_…

RK3568驱动指南|第九篇 设备模型-第102章 platform总线注册流程实例分析实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序&#xff0c;主要用于图像处理和测量。以下是对代码的一些总结&#xff1a; 1. **图像显示与加载&#xff1a;** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

纯css实现三等分饼图

实现原理&#xff0c;先绘制一个圆&#xff0c;然后把圆分成两份&#xff0c;在绘制一个菱形&#xff0c;最下面的角是120&#xff0c;这样就可以实现三等分啦 关键代码是一个css很少见的属性clip-path clip-path: polygon(24rem 36rem, 48rem 18rem, 24rem 0, 0 18rem); &…

使用Python做个可视化的“剪刀石头布”小游戏

目录 一、引言 二、环境准备与基础知识 三、游戏界面制作 四、游戏逻辑实现 五、代码示例 六、游戏测试与优化 七、扩展与改进 八、总结 一、引言 “剪刀石头布”是一种古老的手势游戏&#xff0c;它简单易懂&#xff0c;趣味性强&#xff0c;适合各个年龄段的人参与。…

Reids在Win下无法远程访问

1.将redis在windows上启动主要做了以下配置 1.1.在redis.windows.conf中修改一下 原&#xff1a;bind 127.0.0.1 改&#xff1a;# bind 127.0.0.1 bind 0.0.0.0 原&#xff1a;protected-mode yes 改&#xff1a;protected-mode no去掉了127.0.0.1&#xff0c;加入0.0.0.0后&…

CC++刷题练习

蓝桥杯[错误的票据] 题目&#xff1a; 某涉密单位下发了某种票据&#xff0c;并要在年终全部收回每张票据有唯一的ID号。全年所有票据的ID号是连续的&#xff0c;但ID的开始数码是随机选定的。因为工作人员疏忽&#xff0c;在录入ID号的时候发生了一处错误&#xff0c;造成了某…

基于ssm+vue搭建的新闻网站论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

百度Apollo:激光雷达检测技术深度解析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

【Docker】docker部署conda并激活环境

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、新建dockerfile文件二、使用build创建镜像1.报错&#xff1a;Your shell has not been properly configured to use conda activate.…

快速学习SpringBoot

SpringBoot springboot传统方式构建spring应用程序使用springboot子项目构建起步依赖自动配置其它特性 SpringBoot项目部署Spring项目部署属性配置方式命令行参数方式配置环境变量方式外部配置文件方式 多环境开发-Pofiles多环境开发分组 springboot 传统方式构建spring应用程…

【数据结构】数组实现队列(详细版)

目录 队列的定义 普通顺序队列的劣势——与链队列相比 顺序队列实现方法&#xff1a; 一、动态增长队列 1、初始化队列 2、元素入队 3、判断队列是否为空 4、元素出队 5、获取队首元素 6、获取队尾元素 7、获取队列元素个数 8、销毁队列 总结&#xff1a; 动态增长队列…