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

news2025/6/9 8:50:46

文章目录

  • 前言
  • 一、开发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 Action
  static action upload_file parameter ymoon_s010;
  //新增Action
  static 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传送的parameter
    data(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_t010
      set filename = lv_filename
          filetype = lv_filetype
          attachment = attachment
    where 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:FileUploader
                id="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().Uuid
   var 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 Refresh
                   MessageBox.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.Attachment

     if (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转为blob
         var 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.coloradmin.cn/o/1355163.html

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

相关文章

Pikachu--数字型注入(post)

Pikachu--数字型注入&#xff08;post&#xff09; 进入页面 输入 127.0.0.1/pikachu 选择sql注入&#xff08;数字型&#xff09; 2&#xff09;打开foxy代理&#xff0c;输入值“1”进行bp抓包 3&#xff09;将这个获取的包转发到Repeater中 判断注入点 4&#xff09;用单…

光耀未来 第一届能源电子产业创新大赛太阳能光伏赛道决赛在宜宾举行

1月3日&#xff0c;第一届能源电子产业创新大赛太阳能光伏赛道决赛在宜宾盛大举行&#xff0c;本次比赛吸引了全国范围内的光伏行业顶尖人才和创新团队参与。 为深入贯彻《关于推动能源电子产业发展的指导意见》&#xff0c;推动我国能源电子产业升级&#xff0c;工业和信息化部…

每日算法打卡:递归实现组合型枚举 day 4

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码优化 原题链接 93. 递归实现组合型枚举 题目难度&#xff1a;简单 题目来源&#xff1a;《算法竞赛进阶指南》 题目描述 从 1∼n 这 n 个整数中随机选出 m 个…

电动汽车BMS PCB制板的技术分析与可制造性设计

随着电动汽车行业的迅猛发展&#xff0c;各大厂商纷纷投入巨资进行技术研发和创新。电动汽车的核心之一在于其电池管理系统&#xff08;Battery Management System, BMS&#xff09;&#xff0c;而BMS的心脏则是其印刷电路板&#xff08;PCB&#xff09;。通过这篇文章探讨电动…

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

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

prometheus grafana nginx 安装配置和使用

文章目录 前传prometheus exporter容器监控nginxnginx需要加载stub_status监控查看有没有&#xff0c;如果有&#xff0c;去配置下nginx重要&#xff0c;需要重启nginx测试监控是否成功 prometheus中添加nginx-exporter配置 grafana外传 前传 prometheus grafana的安装使用&am…

防爆气象站跟传统气象站相比有哪些优势?

防爆气象站是一种特殊的气象站&#xff0c;设计用于在易燃易爆、高温、潮湿等恶劣环境下进行气象监测。以下是防爆气象站的优点&#xff1a; 防爆性能&#xff1a;防爆气象站能够承受极端恶劣的环境条件&#xff0c;可以在易燃易爆、高温、潮湿等危险环境下进行工作&#xff0…

企业无法处理海量的大文件,FTP不可靠该如何进行替代?

FTP是一项标准协议&#xff0c;用于在网络中进行文件传输&#xff0c;最早于1971年问世&#xff0c;被认为是互联网的基石之一。FTP可在不同操作系统和网络环境下实现文件上传和下载&#xff0c;具备方便、迅速和高效的特性&#xff0c;广泛应用于网站建设、软件更新、数据备份…

Django 8 通用视图基础

1. 什么是通用视图 1. 在terminal 输入 django-admin startapp the_12回车 2. tutorial\settings.py 注册 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.sta…

权威外媒聚焦:Messari强调波场TRON在全球加密支付领域的引领作用

近日,金融时报、费加罗报及美联社等海外权威媒体就波场TRON 在全球加密支付领域的重要进展发布了相关报道。报道引述加密研究机构Messari 《Crypto Theses for 2024》年度报告,重点强调了波场TRON在推动全球加密货币支付尤其是稳定币USDT应用方面的显著成就。 报道提到,波场TR…

【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Vue3+Typescript+setup / Vue2使用scrollIntoView()实现锚点跳转指定列表

在标签上添加ref属性来引用DOM元素&#xff0c; Vue2中使用$refs来获取该DOM元素并调用scrollIntoView()方法。 使用ref"yearDiv"在每个年份的div元素上添加了一个引用。然后&#xff0c;在yearClick方法中&#xff0c;我们通过this.$refs.yearDiv[year]来获取对应…

HTML5-新增表单input属性

新增表单属性 form控件主要新增的属性: autocomplete 是否启用表单的自动完成功能&#xff0c;取值&#xff1a;on&#xff08;默认&#xff09;、off novalidate 提交表单时不进行校验&#xff0c;默认会进行表单校验 autocomplete属性 概念&#xff1a;autocomplete属性…

Ontrack EasyRecovery(易恢复中国)2024专业数据文件恢复软件

Ontrack EasyRecovery(易恢复中国)是全球著名数据厂商Kroll Ontrack出品的一款专业数据文件恢复软件.EasyRecovery数据恢复软件支持恢复不同存储介质数据:硬盘,光盘,U盘/移动硬盘,数码相机,RAID磁盘阵列数据恢复修复等,EasyRecovery中文版可以恢复被删除或丢失的包括文档,表格,…

nodejs-day1——模块、第三方包管理

自定义模块 我们创建的每个JS文件都是一个自定义模块&#xff0c;并且具有模块作用域&#xff0c;也就是在一个模块中创建的变量、常量、函数等等一切&#xff0c;都只能在当前模块中使用 优点&#xff1a; 1.共享&#xff08;导出/暴露&#xff09;内容给其它模块用&#x…

rabbitmq延时队列相关配置

确保 RabbitMQ 的延时消息插件已经安装和启用。你可以通过执行以下命令来安装该插件&#xff1a; rabbitmq-plugins enable rabbitmq_delayed_message_exchange 如果提示未安装&#xff0c;以下是安装流程&#xff1a; 查看mq版本&#xff1a; 查看自己使用的 MQ&#xff08;…

基于B/S架构的数字孪生智慧监所可视化监管系统

1 前言 物联网技术的发展使云计算技术得到了迅猛的发展及广泛的应用&#xff0c;智能体系的创建已经成为监狱发展的必然趋势。 智慧监狱的创建、智能化管理的推行是监狱管理的创新&#xff0c;也是监狱整体工作水平提升的具体体现。 1.1 建设背景 近年来&#xff0c;司法部不…

数字孪生与边缘计算的结合

数字孪生与边缘计算的结合可以在物理实体附近进行实时数据处理和决策&#xff0c;从而提高响应速度、降低延迟&#xff0c;并有效地利用边缘资源。以下是数字孪生在边缘计算中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展&#xff0c;web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求&#xff0c;许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西&#xff0c;…

sqlserver把Long类型的时间转换为可视化的时间

SqlServer 把Long类型日期还原yyyy-MM-dd HH:mm:ss格式日期&#xff1a; SELECT CONVERT(DATETIME, Dateadd(second, 1704330940847 / 1000, 19700101 08:00), 111) AS tt SqlServer 把Long类型日期还原yyyy-MM-dd格式日期&#xff1a; SqlServer中&#xff0c;按照UTC计算标准…