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


前言

这系列文章详细记录在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;
 }

三、测试

在这里插入图片描述

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值