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

2024-01-05 11:28
文章标签 交互 端的 ui5

本文主要是介绍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;}

三、测试

在这里插入图片描述

这篇关于UI5与后端的文件交互(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程

序言 当一个新的 Pod 被提交创建之后,Kubelet、CRI、CNI 这三个组件之间进行了哪些交互? Kubelet -> CRI -> CNI 如上图所示: Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet 创建 sandbox 并配置好 Pod 的环境,其中包括: Kubelet 通过 gRPC 调用 C

【SpringMVC学习07】SpringMVC与前台的json数据交互

json数据格式在接口调用中、html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍。在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据。 1. 两种交互形式  springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种

【Qt】Qt与Html网页进行数据交互

前言:此项目使用达梦数据库,以Qt制作服务器,Html制作网页客户端界面,可以通过任意浏览器访问。 1、Qt与网页进行数据交互 1.1、第一步:准备qwebchannel.js文件 直接在qt的安装路径里复制即可 1.2、第二步:在Qt的.pro文件加载webchannel组件 在.pro文件添加如下组件: QT += core gui sql webchannel wi

android 的webView加载h5,和h5的交互(java和JavaScript的交互)

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。(通俗点说就是,点击那个Web页面的按钮啥的,可以传到原生app;或者原生app调用Web页面的js方法) 如何实现 实现Java和js交互十分便捷。通常只需要以下几步。 WebView

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。批量字符串(Bulk St

Result 和 自定义异常 在前后端交互中的作用

Result 和自定义异常在前后端交互中扮演着重要的角色。它们可以帮助我们规范化接口返回值,提高错误处理的可读性和可维护性。 Result的作用 Result通常是一个封装了请求结果的类,它包含了请求的状态码、消息和数据。在前端和后端的交互中,Result的作用主要体现在以下几个方面: 统一返回格式:通过Result类,后端可以将请求的结果统一封装成一个固定的格式返回给前端,这样前端可以更

使用Node-API实现跨语言交互开发流程

一、前言         使用Node-API实现跨语言交互,首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧:实现C++方法的调用。代码比较简单,import一个对应的so库后,即可调用C++方法。 Native侧:.cpp文件,实现模块的注册。需要提供注册lib库的名称,并在注册回调方法中定义接口的映射关系,即Native方法及对应的JS/ArkT

flutter的入口和原生交互

从今天起,笔者要开始从flutter列表页面向原生页面跳转了 首先遇到了N个No such module "Flutter" 因为笔者的公司其实是从前往后改造Flutter的,所以也不需要引擎组,但是笔者搞不懂,只能照着葫芦画瓢,以后等笔者Flutter技术日渐精进,一定回过来更新怎么单个页面嵌入flutter。 在Appdelegate里还有很多_lifeCycleDelega